0

コンピューター(シミュレーターでテストする場合)または電話(電話で直接テストする場合)でタイムゾーンを変更しても、DateTime.ToLocalTime()更新された結果が返されません。

の通知イベントを登録して正常に受信しましたUIApplication.Notifications.ObserveSignificantTimeChangeTimeZoneInfo.ClearCachedData()その中で、タイムゾーンが実際に変更されたことを検出できるように呼び出しますが、これはに影響を与えませんToLocalTime()DateTime私が変換しているのは間違いなく協定世界時です(たとえば試してDateTime.UtcNowみました)。

CultureInfo.CurrentCulture.ClearCachedData()この質問で提案されているように呼び出してみました: SetTimeZoneInformationは別の.NETアプリケーションのDateTime.Nowを更新しません。これにより、がnullの場合にのみアプリケーションがクラッシュしますCurrentCulture

の実装をもう少し深く掘り下げるとToLocalTime()、オブジェクトを使用しているようTimeZone.CurrentTimeZoneです。DateTime.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;

これがどういうわけかあなたを正しい方向に向けてくれることを願っています。私はこれよりも優れたものはありません-答え。

于 2013-02-04T19:40:40.710 に答える