Cassandra – 插入时使用错误的时区

这是我试图插入到我的数据库的date:

'1970-01-18T00:00:00+00:00' 

但是当我查看数据库中的条目时,它的背后是8个小时:

 1970-01-17 16:00:00 

我的Ubuntu系统上使用的时区是UTC。 我通过在terminalinputdate检查输出:

 Tue Oct 4 00:00:53 UTC 2016 

我正在使用node.js,这实际上是用来插入的代码:

 const Cassandra = require( 'cassandra-driver' ); const Promise = require( 'bluebird' ); const db = Promise.promisifyAll( new Cassandra.Client({ contactPoints: ['127.0.0.1'], keyspace: 'project' }) ); let date_created = '1970-01-18T00:00:00+00:00'; db.executeAsync( "INSERT INTO posts (id, date_created) VALUES (?, ?);", [someID, date_created], {prepare: true} ); 

我直接从apache网站安装了cassandra,在安装或执行二进制文件时没有指定任何时区或任何东西。

有谁知道为什么时间是8个小时了,我该如何解决?

编辑:我尝试了不同的硬编码date,显然不是所有的date是8小时后面。 与二月,三月和四月的月份相关的date在数据库中显示7个小时。 十二月份仍然会出现八个小时。

编辑2:哇! 所以我没有提到我用来查看数据的IDE,因为我不认为这很重要,但是我使用了dbeaver 。 我决定在terminal中使用cqlsh来查看我的数据(而不是在dbeaver中查看),并且值是正确的! 我也尝试通过node.js检索数据并打印出值,而且值也是正确的! 这使我得出这样的结论:dbeaver或cassandra驱动程序使用它。

这是一个错误? 或者有没有办法使date正确显示在dbeaver中?

Cassandra时间戳代表一个时刻,不存储时区信息,JavaScript中的正确表示是Date

转换为string时, Date实例根据系统的时区(运行Node.js的系统)显示date和时间。

在你的情况下:

 const d1 = new Date('1970-01-18T00:00:00+00:00'); // Numeric value as the number of milliseconds since UNIX epoch. const time = d1.getTime(); db.executeAsync(insertQuery, [ id, d1 ], { prepare: true } ); // ... db.executeAsync(selectQuery, [ id ], { prepare: true }) .then((result) => { console.log('Are equal?', time, result.first()['date_created'].getTime()) }) 

这两个值应该是相等的。

问题是dbeaver使用了jvm,它依赖于jvm使用的任何时区来显示date,这对我来说是自从我住在加州以来的太平洋时区。 这解释了7/8小时的时差(取决于夏令时)。 数据本身是正确的,但(dbeaver只是改变它的显示目的)。

要更改用于在dbeaver中显示date的时区,只需添加几个命令行参数即可。 如果你从terminal运行dbeaver,命令是:

 path/to/dbeaver.exe -vmargs -Duser.timezone=UTC 

为了使这个简单,所以你不必每次都input,我build议创build一个桌面快捷方式。 我在一个Windows机器上,所以我刚刚右键单击可执行文件,单击新build>快捷方式,右键单击快捷方式,单击properties ,并附加-vmargs -Duser.timezone=UTC到目标命令,以便它看起来像path/to/dbeaver.exe -vmargs -Duser.timezone=UTC 。 然后,我只是将快捷方式拖到桌面上。