4

XP を実行している顧客の PC に VB.NET アプリケーションをインストールしましたが、DateTime.ToLocalTime() が機能しなくなったようです。

この問題は、2013 年 8 月に初めて現れました。

顧客はテキサスに拠点を置いており、タイムゾーンは正しいです。

DateTime.ToLocalTime() のドキュメントには、次の興味深いメモがあります。

Windows XP システムでは、ToLocalTime メソッドは、UTC から現地時間への変換時に現在の調整規則のみを認識します。その結果、現在の調整規則が有効になる前の期間の変換では、UTC と現地時間の差が正確に反映されない場合があります。

そのため、8 月の Windows Update でタイムゾーン ルールの変更が導入されたため、この問題が発生した可能性があります。

次の情報を見つけました: http://support.microsoft.com/kb/2863058これは、2013 年 8 月に累積的なタイムゾーンの更新が適用されたことを示していますが、この変更には米国の規則が関係していないようです。

他の誰かがこの問題を経験したことがありますか? (もちろん) 解決策はありますか?

編集

少し明確にするために。問題の時刻は UTC で SQL データベースに格納されており、表示のために LocalTime に変換しています。問題の原因となっているのはディスプレイです。

現地時間 1500 に記録されたイベントが、2100 に記録されたものとして表示されるようになりました。

4

2 に答える 2

2

クライアントのために製品を再コーディングできますか?

Format 関数または DateTime.Now を使用できます。これにより、ローカル コンピューターの日付と時刻の詳細が得られます。

ここで試してみてください:

        Textbox1.text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt") 
        Textbox1.Text = Format(now, "yyyy-MM-dd hh:mm:ss")

文字列内の日時の詳細を変更できます。y=年、M=月、d=日、h=時、m=分、s=秒を覚えておいてください。

ただし、バックエンド データベースがある場合は、そこから時間を取得することをお勧めします。(これはデータベースに依存します)

于 2013-11-20T08:59:26.450 に答える
0

コードを表示していないため、これは単なる推測です。(質問にコードを表示してください。これにより、支援がはるかに簡単になります!)

テキサスは現在、中部標準時 (UTC-6) です。あなたが報告した時間 (1500 年、2100 年) には 6 時間の差があるので、何らかの形で2 回変換していると思います。

.Kindにアタッチされたプロパティのおかげで、これは通常の条件下では発生しないはずDateTimeです。例えば:

DateTime dt1 = new DateTime(2013, 11, 22, 3, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("{0:HH:mm} ({1})", dt1, dt1.Kind);  // 3:00 (Utc)

DateTime dt2 = dt1.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt2, dt2.Kind);  // 21:00 (Local)

DateTime dt3 = dt2.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt3, dt3.Kind);  // 21:00 (Local)

しかし、どういうわけかその種類の追跡を失い、それが「未指定」に戻された場合、二重変換が発生する可能性があります:

DateTime dt1 = new DateTime(2013, 11, 22, 3, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("{0:HH:mm} ({1})", dt1, dt1.Kind);  // 3:00 (Utc)

DateTime dt2 = dt1.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt2, dt2.Kind);  // 21:00 (Local)

// somehow, the kind is getting set back to unspecified in your code
dt2 = DateTime.SpecifyKind(dt2, DateTimeKind.Unspecified);

DateTime dt3 = dt2.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt3, dt3.Kind);  // 15:00 (Local)

さて、実際に を呼び出している可能性は低いですDateTime.SpecifyKind。代わりに、UTC 時間の代わりにローカル時間を DB に保存する場所をコードで探しています。

または、ローカルを文字列に変換し、その文字列を解析しDateTimeて別の文字列に読み戻すこともできます。DateTimeこれは、UI コードで発生する可能性があります。Localおそらく、フォームでユーザーから収集するときに種類を指定する必要がありますか?

コードがどのように変換されているかを確認できるように、コードをデバッグしてステップスルーする必要があります。そうすれば答えが見つかると思います。

いいえ、2013 年 8 月の Windows タイム ゾーン更新プログラムでは、米国に影響を与えるようなことは何も起こりませんでした。米国で最後に DST が変更されたのは 2007 年でした。それでも、6 時間ではなく 1 時間ずれるでしょう。

于 2013-11-22T05:00:18.363 に答える