我有一些返回JSON的C#Web服务。 .NET JavaScriptSerializer以大纪元时间(自1970年以来的毫秒)返回日期。在任何Windows计算机上,基于Web的应用程序都会将毫秒回复到正确的日期而不会出现问题。
在我的Mac上,日期有时会偏离1小时。不是每一次。只是有时。现在正在我正在构建的iPhone前端上发生这种情况。
我首先想到,在将毫秒除以1000时,我已经失去了一些精度,以创建一个有效的Objective-C NSDate对象。然后我在Mac Firefox上使用相同的时间戳在javascript中测试日期创建,并获得相同的1小时偏移量。
有什么想法吗?感谢...
编辑:我还注意到在XCode的控制台中,创建的日期旁边有一个-4或-5。我假设这是GMT偏移量。这些似乎随着日期是否偏移1小时而变化。因此,一些-4个日期和一些-5个日期是正确的,其中一个是偏移的。
编辑:使用的示例:
console.log(new Date(-1173643200000));
返回1932年10月23日星期日19:00 00:00:00 GMT-0400(EST)
console.log(new Date(-1031515200000));
返回1937年4月24日星期四23:00:00 GMT-0500(EST)
NSDate* date = [NSDate dateWithTimeIntervalSince1970:ticks / 1000];
-589320000000 =
1951-04-30 00:00:00 -0400
-1173643200000 =
1932-10-22 23:00:00 -0500
(这个在Firebug控制台中返回正确,在XCode控制台中错误)
-1303416000000 =
1928-09-12 00:00:00 -0400
-1492545600000 =
1922-09-15 00:00:00 -0400
-1263668400000 =
1929-12-16 00:00:00 -0500
-1252094400000 =
1930-04-29 00:00:00 -0400
-1046458800000 =
1936-11-03 00:00:00 -0500
-1298746800000 =
1928-11-05 00:00:00 -0500
-1031515200000 =
1937-04-24 23:00:00 -0500
(在Firebug控制台和XCode控制台中都返回错误)
-910465200000 =
1941-02-24 00:00:00 -0500
-1152648000000 =
1933-06-23 00:00:00 -0400
-1109793600000 =
1934-10-31 23:00:00 -0500
Microsoft / Mozilla / Apple是否有可能在夏令时开始时制定相互矛盾的规则?
编辑:Mac Firefox和Windows Firefox获得-1031515200000的不同结果。两台机器都设置为相同的时区。
答案 0 :(得分:4)
听起来非常像他们中的一个人从你的时代开始给你打勾,而另一个给你几毫秒自1970年1月1日在你当地的时区 ...或者他们正在解释这样的数据。在夏天,所有“错误”的日期都是机会吗? (编辑:现在我已经看过你的编辑,我看到你正在思考同样的问题。)
你能给我们一些样本值,以及你在不同地方使用的代码吗?你确定价值本身是错的吗,这不只是一个显示问题吗?
如果可能的话,自1970年1月1日午夜 UTC 以来提供瞬间是个好主意。大多数平台提供了一种相当简单的处理方式。在.NET中,如果使用DateTimeOffset
而不是DateTime
,则应至少避免其中一些问题。 (当然,将来,正确的解决方案是使用Noda Time。但还没有。)
编辑:好的,现在你提供了样本数据,看起来实际上 instant 实际上没有任何不一致......这是转换为不同的本地时间。很可能不同的平台会对历史时区信息有不同的看法,当然 - 有些人可能只有一个他们认为是正确的永久性规则而将永远正确,其他人会知道涉及各种变化。不管怎样,我希望期待大多数平台将历史变化考虑在内......
至少在iPhone上,我希望你能够编写代码来找出时区转换,然后将它与.NET通过TimeZoneInfo
进行比较。
您的申请实际上是如何处理这些信息的?您是否及时(可以在不同的时区看到)或当地时间对它感兴趣?
答案 1 :(得分:2)
我的猜测是关于DST何时结束和开始的平台差异。当前年份的时间戳是否正确?
答案 2 :(得分:0)
我敢打赌这是一个时区的事情,你的Mac将时间戳转换为你的本地时区,有些时间戳是夏令时(DST),有些不是,与UTC相比造成一小时的时差没有夏令时。