不同时区的服务器上的UTC时间不同?

时间:2015-06-16 18:52:26

标签: c# sql-server asp.net-mvc datetime timezone

在我的开发服务器上,我将名为“ScheduledDateUtc”的值保存到sqlserver,例如24-11-14 09:00:00我还保存一个名为“UtcOffset”的值并像这样计算“ScheduledDateLocal”:

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

在我的开发服务器上,这工作正常,并为alle时区/ UtcOffset计算正确的ScheduledDateLocal。但是,当我在不同时区部署到Azure服务器时,此计算只需几个小时。

任何人都可以解释原因吗?我猜是有某种设置或系统特定的转换参数?谢谢!

1 个答案:

答案 0 :(得分:1)

您的计算机上是否可能出现错误的结果,而不是Azure,这是因为您将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。以上的输出是:

  

01/06/2015 05:01:01

     

01/06/2015 06: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);

可以使用您的偏移来实例化"custom" timezone并仍然使用上述功能。

我遇到similar issue,我必须根据用户的当地时间安排活动。我最终存储了星期几,小时,分钟和Olson timezone字符串,并使用Noda-Time转换为DateTimeOffset并从那里转换为服务器时间。