带有数字参数的AbsoluteTime表现奇怪

时间:2010-06-13 23:48:25

标签: debugging datetime wolfram-mathematica

这很奇怪:

DateList@AbsoluteTime[596523]

返回

{2078, 7, 2, 2, 42, 9.7849}

但是

DateList@AbsoluteTime[596524]

返回

{1942, 5, 26, 20, 28, 39.5596}

问题:发生了什么事? 请注意,带有数字参数的AbsoluteTime未记录。

(我想我现在知道它正在做什么但是认为这对于将来作为StackOverflow问题是有用的;而且我很好奇是否有一些神奇的596523数字。)

PS:在编写这些实用程序函数以便在Mathematica中转换为unix时间时遇到了这个问题:

(* Using Unix time (an integer) instead of Mathematica's AbsoluteTime...      *)
tm[x___] := AbsoluteTime[x]            (* tm is an alias for AbsoluteTime.    *)
uepoch = tm[{1970}, TimeZone->0];      (* unixtm works analogously to tm.     *)
unixtm[x___] := Round[tm[x]-uepoch]    (* tm & unixtm convert between unix &  *)
unixtm[x_?NumericQ] := Round[x-uepoch] (*  mma epoch time when given numeric  *)
tm[t_?NumericQ] := t+uepoch            (*  args. Ie, they're inverses.        *)

2 个答案:

答案 0 :(得分:5)

如果您将596524和596523从小时转换为秒(乘以3600),您会看到较大的数字大于2 ^ 31-1(最大32位有符号整数值),而较小的数字不是。

答案 1 :(得分:2)

调用AbsoluteTime[x],其中x是整数,是AbsoluteTime[TimeZone->x]的(未记录的)快捷方式。 然后x的正常值将是-12到+12,但是如果你告诉它,它会愉快地从UTC增加或减去高达50万。 为什么它突然发疯在596,524我不知道。 但我想一个合理的答案是“就是不要那样做!”。

PS:另一个答案揭示了魔法596,524小时的神秘面纱。它是(2^31-1)/3600,即您可以存储在无符号32位整数中的最大秒数。