当我在计算机上(在模拟器上测试时)或手机上(直接在手机上测试时)更改时区时,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()
考虑时区变化?
最佳答案
您可以使用 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
都会更改,而不会清除任何缓存。我确实必须重新加载 View ,但没有其他技巧。
要显示/验证本地 TimeZone
我使用:
var localTimeZone = System.TimeZoneInfo.Local.StandardName;
我希望这能以某种方式为您指明正确的方向。我没有比这个“在我的机器上工作”更好的答案了。
关于ios - MonoTouch DateTime.ToLocalTime 在时区更改时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694201/