2015-06-16 271 views
0

在我的开发服务器上,我将一个名为“ScheduledDateUtc”的日期值保存到sqlserver例如24-11-14 09:00:00。我还保存了一个名为“UTCOFFSET”值,并计算出“ScheduledDateLocal”像这样:UTC在不同时区的服务器上的时间不同?

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

在我的dev的服务器能正常工作和它的计算正确ScheduledDateLocal的全部时区/ UTCOFFSET的。但是,当我在不同的时区部署到Azure服务器时,此计算结果为几个小时。

任何人都可以解释为什么吗?我猜是有一些设置或系统特定的转换参数?谢谢!

+0

你知道Azure服务器在什么时区吗? – user990423

+0

Im在UTC + 1和计算是一个小时太多,所以我猜UTC0 – Corstiaan

+1

我的猜测是你将ScheduledDateUtc初始化为Utc日期但是,我认为它不正确你的机器不在Azure上我假设在Utc上。我认为我们需要在您的机器上看到示例输入,输出和Azure上的输出。 –

回答

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。上面的输出是:

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并从那里到服务器时间。

+0

这很有趣。谢谢。将尝试它tomorow – Corstiaan

+0

这工作。下次更好地保存timezoneinfo虽然... – Corstiaan

+0

非常好,谢谢你让我知道它的工作。 –

相关问题