[asp.net-mvc]UTC 时间在不同的时区中服务器上的不同吗?

发布时间: 2017/3/25 13:34:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我的开发服务器上保存一个值,称为"ScheduledDateUtc"日期到 sqlserver 例如 14/11/24 9:00。我还保存一个叫做"UtcOffset"的值和计算"ScheduledDateLocal"就像这样︰

var ScheduledDateLocal = ScheduledDateUtc.AddHours(UtcOffset); //a negative offset would be deducted and a positive offset would be added

我的开发服务器上这工作正常和其计算正确的 ScheduledDateLocal 为不分时区/UtcOffset。然而,当我将部署到 Azure 服务器在不同的时区这个计算是几个小时了。

谁能解释一下原因吗?我猜某种形式的设置或系统特定的转换参数吗?谢谢你 !

解决方法 1:

是它可能不正确的结果实际上是您的机器上并不是蔚蓝的是因为你初始化 ScheduledDateUtc 作为本地时间和 UTC 不?

请考虑以下两行代码︰

new DateTime(2015, 6, 1, 1, 1, 1).AddHours(5).ToUniversalTime().Dump();

new DateTime(2015, 6, 1, 1, 1, 1, DateTimeKind.Utc).AddHours(5).ToUniversalTime().Dump();

在这里,我们是在夏天的时间,也就是 UTC + 1。以上所述的输出为︰

2015/1/6 5:01:01

2015/1/6 6:01:01

他们出 1 小时,由于 '忘' 指定的输入是 UTC 在代码的第一行中的构造函数。

如果你没有对构造函数的访问,因为 ScheduledDateUtc 初始化的 ORM,您可以使用 SpecifyKind :

ScheduledDateUtc = DateTime.SpecifyKind(ScheduledDateUtc, DateTimeKind.Utc)

其不幸的是你要存储不时区的偏移量,因为你可能有日光节约时间的问题。如果你被存储 Windows 时区名称,则可以使用 TimeZoneInfo.ConvertTimeFromUtc (无需指定 Kind 在这里,因为这是假定 UTC) 根据此示例从MSDN:

TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
ScheduledDateLocal = TimeZoneInfo.ConvertTimeFromUtc(ScheduledDateUtc, cstZone);

可以来实例化的"自定义"时区使用你的偏移量和仍然使用上面的函数。

我面临一个类似的问题只好安排事件基于用户的本地时间。我结束了存储的星期、 小时、 分钟和奥尔森时区字符串,天和野田佳彦时间用于转换到何时,从那里到服务器的时间。

官方微信
官方QQ群
31647020