这是连续两天之间的小时数的计算:
(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”,结果证明这是一个问题,因为那是前一天。)
答案 0 :(得分: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[]
]
]
样品使用:
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"
如上所述,上述定义将使用转化中的本地时区和区域设置。
答案 1 :(得分:3)
您可以尝试这样的事情:
tzDreeves = {"Buenos Aires", "13 March", "13 September", 3, 4};
tZone[date_, tz_] :=
Piecewise[{{tz[[4]],
First@
DateDifference[tz[[2]]<>" "<>DateString[date,"Year"], date, "Second"] > 0 &&
First@
DateDifference[tz[[3]]<>" "<>DateString[date,"Year"], date, "Second"] < 0}},
tz[[5]]];
myTimeDif[d1_, d2_, tz_] :=
DateDifference[DateList@AbsoluteTime[d1, TimeZone -> tZone[d1, tz]],
DateList@AbsoluteTime[d2, TimeZone -> tZone[d2, tz]], "Second"]
myTimeDif["March 13, 2011", "March 14, 2011", tzDreeves]
myTimeDif["March 12, 2011", "March 13, 2011", tzDreeves]
- &GT;
{82800,Second} -> 23 hours
{86400,Second} -> 24 hours
在以下示例中,您可以看到DS的效果。我们将时间差绘制在DST前沿的固定日期:
data = Table[{
DateList@DatePlus["March 12, 2011, 11PM", {i 10, "Minute"}],
First@myTimeDif[DatePlus["March 12, 2011, 11PM", {i 10, "Minute"}],
"March 14, 2011, 2 AM", tzDreeves]},
{i, 1, 13}];
DateListPlot[data,
DateTicksFormat -> {"MonthNameShort", " ", "Day", "\n ", "Time"},
GridLines -> {{{{2011, 3, 13}, Red}}, None},
PlotStyle -> PointSize[Large]]
答案 2 :(得分:3)
我于8月4日在comp.soft-sys.math.mathematica上发布了一个相关问题:
http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/6f50f6930f1ac325/
事实证明,M7的Mac版本中存在(是?)错误,在调用AbsoluteTime时基本上忽略了Timezone规范。我认为这个问题在M8中得到了解决,但我不确定。