【问题标题】:Convert timestamps stored in a Mongo collection转换存储在 Mongo 集合中的时间戳
【发布时间】:2011-07-13 16:21:20
【问题描述】:

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

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

在 MySQL 中我可以这样做:

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

有 Mongo 等价物吗?

【问题讨论】:

    标签: mongodb datetime timezone convert-tz


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        在 Mongo 中需要考虑的几点:

        • MongoDB 中的所有日期都以 UTC 格式存储
        • 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);
        

        希望你觉得它有用。

        【讨论】:

        • 他不将日期存储为 Date 对象,而是作为整数和浮点数。
        • 另外,你为什么认为他在使用 C#?看看他问的其他问题,他们大多是关于 PHP 的。
        猜你喜欢
        • 2015-04-01
        • 2016-12-02
        • 2017-11-15
        • 2019-01-18
        • 2016-03-19
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        相关资源
        最近更新 更多