1

我在 Mongo 集合中存储了各种时间戳,有些是浮点数,有些是整数。

它们都存储在 BST 中,服务器将很快切换到 UTC。如何在 Mongo 中将它们转换为 UTC 时间戳?

在 MySQL 中,我可以这样做:

UPDATE `table` SET `field` = CONVERT_TZ(`field`, 'Europe/London', 'UTC');

有Mongo等价物吗?

4

3 回答 3

1

您必须使用您选择的语言并一次更新一种。它应该像for加载数据并重写它的循环一样简单。

只需仔细检查您选择的语言如何处理跨时区的时间戳。进行这样的数据更改会对生产代码产生各种意想不到的影响。

于 2011-07-14T05:00:49.880 回答
-1

时间戳通常采用 UTC 而不是特定时区。我使用的所有日期/时间库都返回时间戳,即自 1970 年 1 月 1 日 UTC 以来的秒数(或毫秒)。检查您用于创建时间戳的库的文档以确保。

这意味着您应该没问题,除非您使用了不遵循此约定的日期/时间库,或者以某种方式自己计算了时间戳并考虑了时区。

例如,在 JavaScript 中,如果您存储从返回的值,new Date().getTime()然后将该值传递new Date(...)给不同的系统,那么无论两个系统的时区如何,您最终都会得到相同的绝对日期/时间。Ruby 也是如此,Time.new.to_i在一台机器上执行,然后Time.at(...)在另一台机器上运行,您将获得相同的绝对日期/时间。当我说“绝对日期/时间”时,我的意思是它的 UTC 时间将是相同的,系统很可能会在本地时区显示它,但这就是你想要的。

于 2011-07-14T06:52:38.253 回答
-2

关于 Mongo 中的日期需要考虑的几点:

  • 所有日期都以 UTC 格式存储在 MongoDB 中
  • MongoDB 在内部将日期存储为 64 位整数,表示自 1970-01-01T00:00:00Z 以来的毫秒数
  • 如果您提供的日期值不是 UTC,它将在驱动程序存储在 MongoDB 之前转换为 UTC

建议不要使用 DateTime.Parse。您将了解有关如何格式化 DateTimes 的各种时区问题。

相反,只需使用具有 UTC 风格的 DateTime 构造函数之一。

例子:

var dateTime = new DateTime(2011, 5, 5, 0, 0, 0, DateTimeKind.Utc);

希望你觉得它有用。

于 2011-07-14T06:20:51.957 回答