夏令时"bug"

dre*_*ves 9 datetime wolfram-mathematica

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

(AbsoluteTime[{2011, 3, 14}] - AbsoluteTime[{2011, 3, 13}]) / 3600
Run Code Online (Sandbox Code Playgroud)

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

要明确问题:AbsoluteTime[{2011,3,13}]给出3508963200.减去unix时代,这是一个unixtime 1299988800.但是将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"这是一个问题,因为那是前一天."

WRe*_*ach 4

您可以使用 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[]
    ]
  ]
Run Code Online (Sandbox Code Playgroud)

使用示例:

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"
Run Code Online (Sandbox Code Playgroud)

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