首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >夏令时"bug“

夏令时"bug“
EN

Stack Overflow用户
提问于 2011-04-27 01:53:10
回答 3查看 855关注 0票数 9

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

代码语言:javascript
复制
(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:00EST“传递给另一个程序时,我会发送减去unix纪元的AbsoluteTime。这在Mathematica中运行得很好。当我转换回unixtime时,我再次得到"2011-03-13 00:00EST“。但如果我将unixtime发送给另一个程序,它会将其解释为"2011-03-12 23:00EST“,这是一个问题,因为那是前一天。)

EN

回答 3

Stack Overflow用户

发布于 2011-04-27 03:57:14

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

代码语言:javascript
复制
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[]
    ]
  ]

示例用法:

代码语言:javascript
复制
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"

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

票数 4
EN

Stack Overflow用户

发布于 2011-04-27 04:17:20

您可以尝试如下所示:

代码语言:javascript
复制
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]  

->

代码语言:javascript
复制
{82800,Second}  -> 23 hours
{86400,Second}  -> 24 hours   

在下面的示例中,您可以看到DS的效果。我们绘制跨越DST边界的固定日期的时间差:

代码语言:javascript
复制
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]]

票数 3
EN

Stack Overflow用户

发布于 2011-04-27 06:44:33

我在2010年8月4日在comp.soft-sys.math.matha上发布了一个相关的问题:

http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/6f50f6930f1ac325/

事实证明,有(was?)M7的Mac版本中存在一个错误,该错误在调用AbsoluteTime时基本上忽略了时区规范。我认为这个问题在M8中已经解决了,但我不确定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5794401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档