DateTime
.NETを同等の JavaCalendar
表現に変換する必要があります。
.NETDateTime
はTicks
、0001年 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
。