转换存储在Mongo集合中的时间戳

时间:2011-07-13 16:21:21

标签: mongodb datetime timezone convert-tz

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

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

在MySQL中,我可以这样做:

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

是否有Mongo等价物?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

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

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

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

答案 2 :(得分:-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);

希望你觉得它很有用。