2015-06-16 220 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

非常好,謝謝你讓我知道它的工作。 –

相關問題