是否有可能错误的结果实际上是在您的机器上而不是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。上面的输出是:
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);
您可以使用偏移而不是实例化一个"custom" timezone并仍然使用上述功能。
我遇到了similar issue,我不得不根据用户的当地时间安排事件。我结束了存储星期几,小时,分钟和Olson timezone字符串,并使用Noda-Time转换为DateTimeOffset并从那里到服务器时间。
你知道Azure服务器在什么时区吗? – user990423
Im在UTC + 1和计算是一个小时太多,所以我猜UTC0 – Corstiaan
我的猜测是你将ScheduledDateUtc初始化为Utc日期但是,我认为它不正确你的机器不在Azure上我假设在Utc上。我认为我们需要在您的机器上看到示例输入,输出和Azure上的输出。 –