2016-10-04 100 views
2

时使用这就是我想插入我的数据库日期:卡桑德拉 - 错误的时区将

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

但是,当我看到在数据库中的条目是8小时背后:

1970-01-17 16:00:00 

我的Ubuntu系统上使用的时区是UTC。我检查由其中输出端子输入date

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 website,并且在安装或执行二进制文件时没有指定任何时区或任何东西。

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

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

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

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

+0

您是通过节点插入时间还是由cassandra加盖 – Derek

+0

@derek我从节点插入时间(如上面的代码所示)。 – Kacy

+0

date_created列的数据库类型是什么?尝试1970-01-18T00:00:00 + 0000而不是1970-01-18T00:00:00 + 00:00 – Veeram

回答

0

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

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

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

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

0

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

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

你的情况:

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个值应该是平等的。

+0

我使用了一个Date对象,就像你一样,不幸的是它没有改变数据库中的结果。我决定将日期更改为不同的硬编码值,以防万一我错过了某些明显的东西,并且出现了一些奇怪的行为,其中有些月份会出现7小时而不是8次。我在我的问题中添加了编辑。 – Kacy

+0

顺便说一句,当我查询节点中的时间戳时,包括了时区“+ 0000”。 – Kacy