c# - 获取我的时区的当前日期
问题描述
我有这段代码在我的本地开发机器和托管站点上显示不同的结果:
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 转换为我当前的时区,它们应该相同或几秒钟不同。谢谢
解决方案
检查运行托管站点的服务器上的时区。这不是新西兰标准时间。区别在于:
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
)。
推荐阅读
- c++ - 有链接器错误“未解决的外部”
- verilog - 了解溢出标志和进位标志之间的区别
- reactjs - React Google Charts - 如何控制 x 轴上的间隔?
- html - 如果在 Angular 中找不到结果,如何隐藏组件
- php - 通过地址栏发送.php文件时如何避免显示参数
- react-native - 找不到 com.tom_roush:pdfbox-android:1.8.10.0。要求:项目:react-native-html-to-pdf
- java - 没有为类 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor 找到序列化程序,两种方法的结果相同但输出不同
- rancher-rke - rke up 错误:FATA[0000] 集群必须至少有一个 etcd 平面主机:无法连接到以下 etcd 主机
- google-cloud-platform - GCP 基于日志的指标错误:REQUEST_CONTEXT_READ
- android - IsClippedToBounds 不适用于 xamarin 形式