5

我有一些返回 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 日星期日 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 的不同结果。两台机器都设置为相同的时区。

4

3 回答 3

4

听起来很像其中一个是给你自纪元以来的滴答声,另一个是给你自 1970 年 1 月 1 日以来在你当地时区的毫秒......或者他们正在以这种方式解释数据。夏天所有的“错误”日期,是否有任何机会?(编辑:现在我看到了你的编辑,我看到你的想法是一样的。)

您能给我们一些示例值,以及您在各个地方使用的代码吗?您确定值本身是错误的,而不仅仅是显示问题吗?

如果可能,最好提供自UTC 时间1970 年 1 月 1 日午夜以来的瞬间。大多数平台都提供了一种相当简单的处理方式。在 .NET 中,如果您使用DateTimeOffset而不是,DateTime您应该至少避免其中一些问题。(当然,在未来,正确的解决方案是使用Noda Time。但现在还不行。)

编辑:好的,现在您已经提供了示例数据,看起来在返回的瞬间实际上没有任何不一致......这是不同的本地时间转换。当然,不同的平台很可能对历史时区信息有不同的看法——有些人可能只是有一个永久的规则,他们认为这是正确的并且永远是正确的,其他人会知道所涉及的各种变化。诚然,我希望大多数平台这些天都会考虑到历史变化……

至少在 iPhone 上,我希望您能够编写代码来找出时区转换,然后将其与 .NET 通过 .NET 提供的内容进行比较TimeZoneInfo

您的应用程序实际上对这些信息做了什么?您对它感兴趣的是瞬间(可以被视为不同时区)还是只是当地时间?

于 2010-01-11T20:47:43.730 回答
2

我的猜测是关于 DST 何时结束和开始的平台差异。当前年份的时间戳是否正确?

于 2010-01-12T18:45:02.303 回答
0

我敢打赌,这是一个时区问题,您的 Mac 将时间戳转换为您的本地时区,对于某些时间戳而言,该时区是夏令时 (DST),而有些则不是,与没有 DST 的 UTC 相比会产生一小时的时差.

于 2010-01-11T20:50:41.910 回答