5

私は助けが必要です。C#ティックからの変換後、Java util の日付が 5 時間遅れている理由を理解しようとしています。

ではC#、日付は 2013 年 6 月 8 日 11:02:07 AM です。この日付をティックに変換してから、Java に として渡しlongます。

コードスニペット:

撮影:

- long TICKS_AT_EPOCH = 621355968000000000L;
- long TICKS_PER_MILLISECOND = 10000;

java.util.Date date = new java.util.Date((ctime - TICKS_AT_EPOCH) / TICKS_PER_MILLISECOND);

現在、Java util の日付は Sat Jun 08 06:02:07 CDT 2013 です。

時間は 5 時間の差であることに注意してください。

なぜ何か提案はありますか?

4

4 に答える 4

5

java.util.Date1970 年 1 月 1 日 UTC からのミリ秒に基づいて を構築しています。System.DateTime.Ticks.netは 1/1/0001 に基づいており、ミリ秒に 10,000 ティックであるという事実から修正しているようです。その通りですが、UTC に合わせるのを忘れています。

.Net では、値はプロパティDateTime.Ticksに大きく依存しDateTime.Kindます。可能な値の種類は 3 つありDateTimeます。

  • DateTimeKind.Utc- この種類は、値が UTC 時間を表すことを意味します。通常は への呼び出しから発生しますがDateTime.UtcNow、直接構築することもでき、多くの場合は構築されます。たとえば、データベースから UTC 時刻を取得する場合があります。ここからティックを変換に直接フィードすることができ、それは機能します。

  • DateTimeKind.Local- これは通常、 への呼び出しから発生しDateTime.Nowます。値は、ローカル タイム ゾーンを表しています。ティックを確認する前に、UTC に変換する必要があります。次のことができます。

    DateTime dt = DateTime.Now;
    int utcTicks = dt.ToUniversalTime().Ticks;
    

    夏時間の「フォールバック」スタイルの移行中に時間が発生した場合、結果が正しくない可能性があることに注意してください。DateTimeクラスはタイムゾーンについて何も知りません。現在のローカル クロックを反映するだけです。の値dtがあいまいな場合、夏時間中に値を取得しただけでも、はその値が標準時ToUniversalTime()を表していると想定します。これは、.netの多くの紛らわしくありそうな側面の 1 つにすぎません。DateTime

  • DateTimeKind.UnspecifiedDateTime- これはあなたが遭遇する最も一般的な種類であり、通常はDateTime.Parse()または のようなコンストラクターから来new DateTime(...)ます。残念ながら、これらの日付が表すタイム ゾーンについては、ここには何も記載されていません。を呼び出すことはできます.ToUniversalTime()が、フレームワークは、これらの時刻がローカル タイム ゾーンを表していると想定し、種類が であるかのようにしLocalます。データの入手方法によっては、この仮定が完全に間違っている可能性があります。Unspecified DateTimeを UTC 値 (ティックなど)に変換する安全な方法は実際にはありません。

DateTimeOffsetの代わりにDateTime使用する、または組み込み型の代わりにNoda Timeライブラリを使用するなど、いくつかの解決策があります。これらの問題の詳細については、こちらこちらをご覧ください。

于 2013-06-23T23:18:05.407 に答える
1

時刻は5時間遅れではなく、まったく同じ時刻です。問題は印刷の仕方です。

日付を文字列に変換するときに、C# と Java に同じタイム ゾーンを使用するように指示する必要があります。そのうちの 1 つは UTC を使用し、もう 1 つは CDT を使用しています。

于 2013-06-23T05:33:50.900 に答える
0

java.util.date は、タイム ゾーンを自動的に修正します。この質問を参照してください: Java.util.Date のタイムゾーンを設定するには?

于 2013-06-23T05:31:25.413 に答える
0

グリニッジctimeを基準とする標準時である UTC (Universal Coordinated Time) です。中央時間で時間を表現しています。あなたの違いがあります。

于 2013-06-23T05:32:40.610 に答える