在我的开发服务器上,我将名为“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服务器时,此计算只需几个小时。
任何人都可以解释原因吗?我猜是有某种设置或系统特定的转换参数?谢谢!
答案 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并从那里转换为服务器时间。