2013-02-04 74 views
0

當我更改我的計算機上的時區(在模擬器上測試時)或手機上(直接在手機上測試時)時,DateTime.ToLocalTime()不會返回更新結果。當更改時區時,MonoTouch DateTime.ToLocalTime不會更新

我註冊併成功收到UIApplication.Notifications.ObserveSignificantTimeChange的通知事件。在這裏,我打電話TimeZoneInfo.ClearCachedData(),它允許我檢測時區實際上已更改,但這對ToLocalTime()沒有影響。我轉換的DateTime絕對是友善的Utc(例如試用DateTime.UtcNow)。

我試過打電話CultureInfo.CurrentCulture.ClearCachedData()在這個問題中建議:SetTimeZoneInformation does not update DateTime.Now for another .NET Application。這隻會導致應用程序在CurrentCulture爲零時崩潰。

深入研究ToLocalTime()的實施,它似乎使用對象TimeZone.CurrentTimeZone。只有在DateTime.GetNow()TimeZone.timezone_check之間的差異時纔會重置此對象。我懷疑TimeZone.timezone_check在調用TimeZoneInfo.ClearCachedData()時沒有更新。

有什麼辦法可以強制ToLocalTime()考慮到時區變化?

回答

2

您可以使用DateTimeOffset。另見this question。 -

編輯我有什麼工作是這樣的:

var dateTimeUtc = new System.DateTime(2013, 2, 4, 21, 30, 0, 
             System.DateTimeKind.Utc); 
var dateTimeOffsetLocal = new System.DateTimeOffset(dateTimeUtc.ToLocalTime()); 
var formattedLocalTime = string.Format("{0:HH:mm}", dateTimeOffsetLocal); 

在我的手機我formattedLocalTime每當我改變我的TimeZone就可以了,無需清除任何緩存的變化。我不得不重新加載視圖,但沒有其他技巧。

要顯示/驗證本地TimeZone我用:

var localTimeZone = System.TimeZoneInfo.Local.StandardName; 

我希望這點不知何故你在正確的方向。我沒有比這更好的「在我的機器上工作」 - 安道爾。

+0

很好的建議,但我遇到了同樣的問題。調用'DateTimeOffset.ToLocalTime()'仍然使用'TimeZone.CurrentTimeZone',它似乎沒有得到更新。 – ysalmi

+0

我得看看我自己的實現。這一個正在爲我工​​作。箍回到這個。 – Jacco

+0

感謝您的幫助。我覺得我失去了一些東西。我嘗試了'TimeZoneInfo.ConvertTimeFromUtc(myUTCDate,TimeZoneInfo.Local)',它使用最新的TimeZoneInfo,但是當我打印出結果時,我仍然得到錯誤的本地時間。 – ysalmi

相關問題