0

当我在计算机上(在模拟器上测试时)或手机上(直接在手机上测试时)更改时区时,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.CurrentTimeZoneDateTime.GetNow()仅当和之间的差异时才重置此对象TimeZone.timezone_check。我怀疑在被调用TimeZone.timezone_check时没有更新。TimeZoneInfo.ClearCachedData()

有什么办法可以强制ToLocalTime()考虑时区变化?

4

1 回答 1

2

您可以为此使用DateTimeOffset 。另请参阅此问题

编辑- 我的工作是这样的:

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。

于 2013-02-04T19:40:40.710 回答