3

DateTime.NETを同等の JavaCalendar表現に変換する必要があります。

.NETDateTimeTicks0001年 1 月 1 日(.NET エポック) 以降、基になる表現として を使用しています。

Javaは、 1970 年 1 月 1 日(Java (または Unix) エポック)GregorianCalendar以降のミリ秒を使用します。期待どおり、Java エポックより前の日付の値は負です。

ここでは、 JavaエポックDateTime以降の表現をミリ秒に変換しています。

var dt = new DateTime(1,2,3);  //way, way back.
var javaEpoch = new DateTime(1970, 1, 1);

var javaMillis = (dt - javaEpoch).Ticks / TimeSpan.TicksPerMillisecond;

dt.ToString("MM/dd/yyyy").Dump();          // .Dump() is provided by LinqPad. 
javaMillis.Dump();                         // Use Console.WriteLine(...)
                                           // for a regular console app.

これは以下を出力します:

02/03/0001 -62132745600000 _
_

次に、この Java スニペットのミリ秒の値をコピーして貼り付けます。

java.util.Calendar cal = new java.util.GregorianCalendar();
cal.setTimeInMillis(-62132745600000L);
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat();
df.applyPattern("MM/dd/yyyy");
System.out.println(df.format(cal.getTime()));

これは以下を出力します:

02/05/0001 _ _

私の質問は次のとおりだと思います:Javaカレンダーを正しく構築できるDateTimeから有効なミリ秒値を取得するにはどうすればよいですか?

...暗黙のサブ質問「ここで実際に何が起こっているのか?」

EDIT:ユリウス暦からグレゴリオ暦までの欠落している日付範囲(1582年10月4日は1582年10月15日が「続く」)の周りでDateTimeValuesをいじりました。

1582 年 10 月 15 日よりも新しい日付については、変換は正常に機能しているようです。

...しかし、不足している範囲の周りで、DateTime はおかしな動作を開始します (または、開始しません)。

var timespan = new DateTime(1582, 10, 15) - new DateTime(1582, 10, 4);

は 11 日の を返すTimeSpanため、DateTime 演算子はホールを考慮しません。何を与える?基になる実装はに基づいていると思いましたSystem.Globalization.GregorianCalendar

4

3 に答える 3

1

驚くべきことに、1582 年 10 月 4 日から 1582 年 10 月 15 日までの間、なぜグレゴリオ暦に「穴」が存在するのかという質問に実際に答えた人は誰もいません。興味深い答えは、1582 年の改正としてグレゴリオ暦が採用された歴史にあります。ユリウス暦に。詳細については、グレゴリオ暦に関するウィキペディアの記事を参照してください。History: Gregorian Reform の段落の最後の段落には、次のように記載されています。

  • グレゴリー (教皇グレゴリウス 13 世) は、カレンダーを季節と同期させるために 10 日を減らしました。したがって、新しい暦が使用されるようになったとき、ニカイア公会議以来 13 世紀に蓄積された誤りは、10 日を削除することによって修正されました。ユリウス暦の 1582 年 10 月 4 日木曜日の後に、グレゴリオ暦の最初の日である 1582 年 10 月 15 日金曜日が続きました (平日のサイクルは影響を受けませんでした)。

実際、1582 年 10 月 5 日から 1582 年 10 月 14 日までの日付は、グレゴリオ暦には存在しません。.Net Framework は一般化された式を使用し、1582 年 10 月 15 日より前の日付を処理する際に違いを考慮していないのに対し、Java ライブラリはそれを考慮していると思われます。

于 2013-11-12T04:07:08.777 に答える
0

Java ドキュメントから:

[...] を使用して取得された日付はGregorianCalendar、現代のユリウス暦規則が採用された西暦 4 年 3 月 1 日以降のみ歴史的に正確です。

あなたの引き算を考えるとDateTime、それは単なるTicks違いです。ここには特定のカレンダーの概念はまったくありません. 実装は基本的にreturn new TimeSpan(x.Ticks - y.Ticks).

内部表現に頼るのではなく、あいまいさのないなどのISO-8061日付/時刻を単純に出力してから解析する方がよい場合があります。0001-02-03T00:00:00Z

于 2013-04-11T15:04:11.190 に答える