首页 > 解决方案 > 获取我的时区的当前日期

问题描述

我有这段代码在我的本地开发机器和托管站点上显示不同的结果:

JavaScriptSerializer js = new JavaScriptSerializer();
TimeZoneInfo nzZone = TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time");
litUTC.Text = DateTime.UtcNow.ToString() + " " + js.Serialize(DateTime.UtcNow) + " " + js.Serialize(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, nzZone));

在我的本地机器上,它显示:

21/05/2018 上午 2:15:24 “/日期(1526868924867)/” “/日期(1526868924867)/”

但是在我的托管网站上,它显示:

21/05/2018 凌晨 2:16:01 “/日期(1526868961581)/” “/日期(1526930161581)/”

任何想法为什么托管站点上的那个变成 1526930161581?这两者之间的差距很大。结果,当我将它转换回日期格式时,它变成了 22/05/2018。我将它们都从 UtcNow 转换为我当前的时区,它们应该相同或几秒钟不同。谢谢

标签: c#datetime

解决方案


检查运行托管站点的服务器上的时区。这不是新西兰标准时间。区别在于:

1526868961581 - 1526930161581 = 61200000 毫秒(17 小时)

由于新西兰标准时间是 +12,因此服务器上的时区似乎是 -5,即东部时间。所以看起来服务器位于美国(或加拿大)。

请注意,当JavaScriptSerializer序列化日期时,它首先将它们转换为 UTC。然后它计算 Unix 纪元毫秒并将结果放入/Date()/. 所以不要UtcNow直接使用和序列化你的日期,比如js.Serialize(DateTime.Now). 当您new Date()在 JavaScript 的构造函数中使用毫秒值时,它假定它为 UTC,并使用浏览器的时区将其转换为本地时间。

这是来自MSDN的上述描述:

Microsoft 的 ASP.NET AJAX [...] 将 .NET DateTime 值编码为 JSON 字符串,其中字符串的内容是 /Date(ticks)/,其中 ticks 表示自纪元 (UTC) 以来的毫秒数。因此,1989 年 11 月 29 日凌晨 4:55:30,UTC 编码为“/Date(628318530718)/”。

JavaScriptSerializer有一些问题,/Date()/序列化是由微软创建的,不是标准。建议改用支持 ISO 标准的库(例如Newtonsoft.Json)。


推荐阅读