【问题标题】:Why moment.utc(...).diff(moment.utc(...)) gets affected by source date offsets为什么 moment.utc(...).diff(moment.utc(...)) 会受到源日期偏移的影响
【发布时间】:2014-12-14 15:28:44
【问题描述】:

检查以下代码示例:

moment.utc("2014-10-19T09:27:57.9417128+00:00")
      .diff(moment.utc("2014-10-19T09:27:57.9417128+02:00"))

我希望 0 因为我将两个日期都转换为 UTC,但这会给出 7200000 作为结果。

事实上,我希望 moment.fromNowmoment.from 与 UTC 一起工作,以便获得一个没有无效结果的 X seconds/minutes/hours... ago,因为 Date/moment 翻译日期时间基于日期的偏移量。

我在这里做错了什么?

【问题讨论】:

    标签: javascript html date momentjs


    【解决方案1】:

    我不确定您为什么认为应该忽略源偏移量。它们与转换为 UTC 尤其相关,因为它们实际上代表了 UTC 与所表示的时间之间的差异。

    在第一个时间戳中,+00:00 表示时间已经是 UTC。在第二个时间戳中,+02:00 表示时间比 UTC提前两个小时。 2 * 60 * 60 * 1000 = 7200000.

    换句话说:

        2014-10-19T09:27:57.9417128+00:00  ==  2014-10-19T09:27:57.9417128Z
    -   2014-10-19T09:27:57.9417128+02:00  ==  2014-10-19T07:27:57.9417128Z
    =======================================================================
                                                          02:00:00
    

    结果不可能为零,因为无论你怎么看,这两个时间戳代表两个不同的时间点,它们相隔两个小时。

    由于 moment 的 fromNow 函数已经适用于当前的 UTC 时间,并且您有一个带偏移量的完整 ISO 时间戳,您可以直接使用它而无需任何转换。

    moment("2014-10-19T09:27:57.9417128+02:00").fromNow()
    

    您甚至不需要先转换为 UTC。你可以这样做:

    moment.utc("2014-10-19T09:27:57.9417128+02:00").fromNow()
    

    但是这些都将返回相同的内容,因为您已经提供了偏移量。仅当您没有包含偏移量时,它们才会有所不同,在这种情况下,第一个示例将在本地时间解释输入字符串,而第二个示例将在 UTC 中解释输入字符串。两者都不会改变 fromNow 函数的行为。

    【讨论】:

    • 我现在已经删除了我的答案,但我相信我们会让事情变得混乱。我想要实现的是,无论偏移量如何,自从某事发生以来已经过去了多少时间。我的意思是:如果现在发生了某事并且有人想知道自第一次发生以来已经过去了多少时间,那么对于世界上的任何人来说都是一样的,即使用户在 +08:00 偏移量并且服务器在+02:00
    • 抱歉,这不是真的。我不知道你为什么会这么想。偏移量是时间戳的反映。例如,我现在的时钟是下午 12:17,而我的偏移量是 -07:00。对于 +02:00 中的某个人来说,现在是晚上 9:17。对我们俩来说,现在是世界标准时间晚上 7:17。
    • 对我来说,当我拨打from 时,我和你的约会对象,我会得到“7 小时前发生的事情”这不是真的
    • 如果没有偏移量,您可能会得到它。但是,只要一开始就正确记录,偏移量就可以确保不会发生这种情况。如果由于某种奇怪的原因,您在记录时将偏移量与时间戳分离,这可能解释了您描述的行为,但在正常情况下,这不应该发生。
    • 那么,你还觉得我的回答错了吗?如果我想知道自从世界上发生某些事件以来已经过去了多少时间,我需要两个日期时间都采用 UTC (+00:00)。
    猜你喜欢
    • 2022-01-16
    • 2021-10-18
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2016-02-04
    • 2018-11-09
    相关资源
    最近更新 更多