我的代码在我的开发本地计算机和托管网站上显示不同的结果:
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 AM“/日期(1526868924867)/”“/日期(1526868924867)/”
但是在我的托管网站上,它显示:
21/05/2018 2:16:01 am.m.“/ Date(1526868961581)/”“/ Date(1526930161581)/”
为什么托管网站上的那个成为1526930161581?这是两者之间的巨大差距。结果这变成了22/05/2018,当时我将它转换回日期格式。我将它们从UtcNow转换为我当前的时区,它们应该相同或者几秒钟不同。 感谢
答案 0 :(得分:0)
检查运行托管站点的服务器上的时区。这不是新西兰标准时间。区别在于:
1526868961581 - 1526930161581 = 61200000毫秒(17小时)
由于新西兰标准时间为+12,因此服务器上的时区看起来像是东部时间的-5。所以看起来服务器位于美国(或加拿大)。
请注意,当JavaScriptSerializer
序列化日期时,它会首先将它们转换为UTC。然后计算Unix Epoch毫秒并将结果放在/Date()/
内。因此,请勿使用UtcNow
并直接序列化您的日期,例如js.Serialize(DateTime.Now)
。当您在JavaScript中使用new Date()
构造函数中的毫秒值时,它假定它以UTC格式并使用浏览器的时区将其转换为本地时间。
以下是MSDN的说明:
Microsoft的ASP.NET AJAX [...]将.NET DateTime值编码为JSON 字符串,其中字符串的内容是/ Date(ticks)/和where ticks表示自纪元(UTC)以来的毫秒数。所以1989年11月29日, 4:55:30 AM,UTC编码为“/ Date(628318530718)/”。
JavaScriptSerializer
有一些问题,/Date()/
序列化是由Microsoft创建的,不是标准。建议使用支持ISO标准的库(例如Newtonsoft.Json
)。