【问题标题】:MonoTouch DateTime.ToLocalTime does not update when time zone is changed更改时区时 MonoTouch DateTime.ToLocalTime 不会更新
【发布时间】:2013-01-19 14:13:53
【问题描述】:

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

【问题讨论】:

    标签: ios datetime xamarin.ios


    【解决方案1】:

    您可以为此使用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);
    

    在我的手机上,每当我更改我的TimeZone 时,我的formattedLocalTime 就会更改,而不会清除任何缓存。我确实必须重新加载视图,但没有其他技巧。

    显示/验证我使用的本地TimeZone

    var localTimeZone = System.TimeZoneInfo.Local.StandardName;
    

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

    【讨论】:

    • 好建议,但我遇到了同样的问题。调用DateTimeOffset.ToLocalTime() 仍然使用似乎没有更新的TimeZone.CurrentTimeZone
    • 我将不得不研究我自己的实现。这个对我有用。箍回到这个。
    • 感谢您的帮助。我觉得我错过了什么。我尝试了TimeZoneInfo.ConvertTimeFromUtc(myUTCDate, TimeZoneInfo.Local),它使用了最新的 TimeZoneInfo,但是当我打印出结果时,我仍然得到错误的本地时间。
    • 我用我自己的代码示例扩展了我的答案。希望对您有所帮助。
    • 感谢您的回答 Jacco,我仍在深入研究此问题,我很确定我这边存在错误。需要明确的是,这适用于 iOS 模拟器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多