【问题标题】:Cassandra - Wrong timezone being used when insertingCassandra - 插入时使用了错误的时区
【发布时间】:2017-02-12 00:38:54
【问题描述】:

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

'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 安装了 cassandra,并且在安装或执行二进制文件时没有指定任何时区或任何内容。

有谁知道为什么要休息 8 小时以及如何解决?

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

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

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

【问题讨论】:

  • 你是通过节点插入时间还是被cassandra标记
  • @derek 我正在从节点插入时间(如上面的代码所示)。
  • date_created 列的数据库类型是什么?尝试 1970-01-18T00:00:00+0000 而不是 1970-01-18T00:00:00+00:00
  • 你有没有试过插入一个Date对象,而不是要解析为日期时间的字符串?,换句话说,你可以试试let date_created = new Date(Date.parse("1970-01-18T00:00:00+00:00"))
  • @Reddy date_created 列的类型为timestamp。尝试您的建议得到了相同的结果。

标签: node.js datetime cassandra dbeaver


【解决方案1】:

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())
  })

这两个值应该相等。

【讨论】:

  • 我和你一样使用了一个 Date 对象,不幸的是它并没有改变数据库中的结果。我决定将日期更改为不同的硬编码值,以防万一我遗漏了一些明显的东西,并且出现了一些奇怪的行为,其中几个月出现了 7 小时而不是 8 小时。我在我的问题中添加了一个编辑。
  • 顺便说一句,当我查询节点中的时间戳时,包含时区+0000
【解决方案2】:

问题是 dbeaver 在后台使用 jvm,它依赖于 jvm 用来显示日期的任何时区,对我来说,这是太平洋时区,因为我住在加利福尼亚。这解释了 7/8 小时的时差(取决于夏令时)。但数据本身是正确的(dbeaver 只是为了显示目的而对其进行了更改)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2020-03-05
    • 2014-06-05
    • 2016-03-24
    • 2020-08-10
    • 2015-04-14
    相关资源
    最近更新 更多