gpt4 book ai didi

datetime - 夏令时 "bug"

转载 作者:行者123 更新时间:2023-12-02 15:14:40 27 4
gpt4 key购买 nike

以下是连续两天之间的小时数计算:

(AbsoluteTime[{2011, 3, 14}] - AbsoluteTime[{2011, 3, 13}]) / 3600

因此,您可能不会对 Mathematica 返回 24 感到惊讶。但这是令人惊讶的。所有其他编程语言都会说 23,因为 3 月 13 日是夏令时的开始。我需要我的 Mathematica 程序在这方面与其他语言保持一致。您会推荐什么?

要明确问题:AbsoluteTime[{2011,3,13}] 给出 3508963200。减去 unix 纪元,即为 1299988800 的 unixtime。但是将 unixtime 提供给任何其他编程语言并询问它对应的日期,它会说 3 月 12 日而不是 3 月 13 日。(同样的事情在 3 月 14 日也可以正常工作。)

(好吧,我知道你很想知道为什么我想要遵守所有那些明显不完整的语言。嗯,首先,其他语言都有一个观点:由于“向前推进”,3 月 14 日午夜比 3 月 13 日午夜晚了 23 个小时。为什么我真正关心:我们使用 unixtime 作为日期的规范表示。因此,当我想将“2011-03-13 00:00 EST”传达给另一个程序时,我发送 AbsoluteTime 减去 unix 纪元。这在 Mathematica 中工作得很好。当我将 unixtime 转换回来时,我再次得到“2011-03-13 00:00 EST”。但是,如果我将该 unixtime 发送到另一个程序,它会将其解释为“2011-03-12 23:00 EST”,这结果是一个问题,因为那是前一天。)

最佳答案

您可以使用 Java 在 Unix 时间之间来回转换:

Needs["JLink`"]
LoadJavaClass["java.util.Calendar"]

ToUnixTime[year_, month_, day_, hour_:0, minute_:0, second_:0] :=
JavaBlock[
Module[{calendar}
, calendar = java`util`Calendar`getInstance[]
; calendar@set[year, month - 1, day, hour, minute, second]
; Floor[calendar@getTimeInMillis[] / 1000]
]
]

FromUnixTime[time_Integer] :=
JavaBlock[
Module[{calendar}
, calendar = java`util`Calendar`getInstance[]
; calendar@setTimeInMillis[time * 1000]
; calendar@getTime[]@toString[]
]
]

使用示例:

In[19]:= ToUnixTime[2011, 4, 26, 1, 2, 3]
Out[19]= 1303801323

In[20]:= FromUnixTime[1303801323]
Out[20]= "Tue Apr 26 01:02:03 MDT 2011"

如前所述,前面的定义将在转换中使用您的本地时区和区域设置。

关于datetime - 夏令时 "bug",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com