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