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
。 然后,我只是将快捷方式拖到桌面上。
- 使用IN查询使用nodejs'cassandra-driver'准备好的查询
- nodejs – cassandra-client错误:所有连接都不健康
- Cassandra – NodeJS – 检索地图types值时发出
- 卡桑德拉:操作超时
- 使用nodejs脚本将GB的数据从MongoDB迁移到Cassandra的最佳方法
- Cassandra nodejs DataStax驱动程序不会通过准备好的语句执行返回新添加的列
- Cassandra驱动程序在php,java,python,node.js中的拓扑意识
- 显示缓冲区types数据的string的cassandra timeuuid列
- Node.js lsof – 许多打开的数据库连接