2

Javaでミリ秒を時間に変換しようとしています。

C#でこれを行うと

DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

Console.WriteLine("1406205185123 = " + EpochOrigin.AddMilliseconds(1406205185123));

結果 2014/07/24 12:33:05

Javaで同じことをすると

 Calendar cc = new GregorianCalendar();

cc.setTimeInMillis(1406205185123L);

結果 Thu Jul 24 13:33:05 BST 2014

Java の結果は、C# よりも 1 時間長くなります。

どうすればこれを修正できますか?

4

3 に答える 3

2

C#DateTimeでは、タイム ゾーン情報は格納されませんが、このインスタンスによって表される時刻が現地時間、協定世界時 (UTC)、またはネイティ( MSDNKindを参照) のいずれに基づいているかを示す値を持つプロパティがあります。プロパティのデフォルト値はです。したがって、C# コードでは、次の行で作成された構造体 DateTime.KindUnspecifiedDateTime

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

必ず次の方法で作成する必要があります。

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

変換の基準時間として使用するため (エポック時間の起点は 1970 年 1 月 1 日 00:00 UTCです)。

詳細については、前の質問https://stackoverflow.com/a/2883645/1236452を参照してください。

編集 1

簡単な発言: DateTimeC#では、何らかの形でタイム ゾーンを認識しています (私の現地時間は GMT+1 です)(編集: コメントと編集 2 を参照してください):

DateTime t = new DateTime(1970,1,1,0,0,0);
Console.WriteLine(t.ToLocalTime());      // 01/01/1970 01:00:00 (GMT+1)
Console.WriteLine(t.ToUniversalTime());  // 31/12/1969 23:00:00 (GMT)

編集 2

コメントで正しく指摘されているようにDateTime、タイムゾーン情報を保持しているという意味でタイムゾーンを認識していません。ただし、そのプロパティには、ドキュメントKindに記載されているように、インスタンスが現地時間または UTC に基づいているかどうかを示す値が格納されます。

DateTime.Kind プロパティ: このインスタンスによって表される時刻が、現地時間、協定世界時 (UTC)、またはどちらにも基づいていないかどうかを示す値を取得します。[...]

Kind プロパティを使用すると、DateTime 値に協定世界時 (UTC) または現地時間を明確に反映させることができます。対照的に、DateTimeOffset 構造体は、任意のタイム ゾーンの任意の時間を単一の時点として明確に反映できます。

于 2014-07-24T16:22:15.280 に答える
2

ご覧のとおり、Java の結果には BST マークがあり、英国の夏時間であることを示しています。そのため、GregorianCalendar はタイム ゾーンを考慮に入れます。

C#のDateTimeはタイムゾーンを認識しないため、UNIXエポックはUTCであるためUTCであり、UTC時間にミリ秒を追加するとUTC時間も取得されます。

于 2014-07-24T16:07:26.107 に答える