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

UTC Time different on servers in different timezones?

在我的开发服务器上,我将一个名为 "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

在我的开发服务器上,这工作正常并且它为所有 timezones/UtcOffset 计算正确的 ScheduledDateLocal。但是,当我部署到不同时区的 Azure 服务器时,此计算会延迟几个小时。

谁能解释一下为什么?我猜有某种设置或系统特定的转换参数?谢谢!

是否有可能错误的结果实际上是在您的机器上而不是在 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

因为我 'forgot' 在第一行代码的构造函数中指定输入是 UTC,他们还有 1 小时。

如果因为 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 where I had to schedule events based on a user's local time. I ended up storing the day of the week, hour, minute, and Olson timezone string, and used Noda-Time to convert to a DateTimeOffset 从那里到服务器的时间。