更改时区时,MonoTouch DateTime.ToLocalTime不会更新

时间:2013-02-04 19:38:38

标签: ios datetime xamarin.ios

当我更改计算机上的时区(在模拟器上测试时)或手机上(直接在手机上测试时)时,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()考虑时区变化?

1 个答案:

答案 0 :(得分: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;

我希望以某种方式指出你正确的方向。我没有比这更好的“在我的机器上工作” - anwer。