关于node.js:Cassandra – 插入时使用了错误的时区

Cassandra - Wrong timezone being used when inserting

这是我尝试插入数据库的日期:

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

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

1
1970-01-17 16:00:00

我的Ubuntu系统上使用的时区是UTC。我通过在终端输入date进行检查,输出:

1
Tue Oct  4 00:00:53 UTC 2016

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

1
2
3
4
5
6
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小时,我怎么能解决它?

编辑:
我尝试了不同的硬编码日期,显然并非所有日期都落后8小时。与2月,3月和4月相关的日期在数据库中落后7个小时。 12月仍然落后8个小时。

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

这是一个错误吗?或者有没有办法让日期在dbeaver中正确显示?


问题是dbeaver在引擎盖下使用jvm,并且它依赖于jvm用于显示日期的任何时区,这对我来说是我住在加利福尼亚以来的太平洋时区。这解释了7/8小时的时差(取决于夏令时)。数据本身是正确的(dbeaver只是为了显示目的而改变它)。

要更改用于在dbeaver中显示日期的时区,您只需添加几个命令行参数。如果从终端运行dbeaver,则命令为:

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

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


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

转换为字符串时,Date实例根据系统的时区(运行Node.js的系统)显示日期和时间。

在你的情况下:

1
2
3
4
5
6
7
8
9
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())
  })

2个值应该相等。