Конвертировать дату между java и .net - 2 выходных
Мне нужно преобразовать .NETDateTime
в эквивалентную JavaCalendar
представление.
СетьDateTime
использованияTicks
поскольку1 января 0001 (эпоха .NET) в качестве основного представления.
ЯваGregorianCalendar
использует миллисекунды с1 января 1970 г. (эпоха Java (или Unix)). Как и ожидалось, значение является отрицательным для дат до эпохи 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
Я предполагаю, что мой вопрос: как я должен получить действительное значение в миллисекундах из DateTime, из которого я могу правильно построить календарь Java?
... с подразумеваемым подвопросом "что на самом деле здесь происходит?
РЕДАКТИРОВАТЬ: я играл с DateTimeValues вокруг пропущенного диапазона дат от юлианского до григорианского календаря (4 октября 1582 это "а затем» к 15 октября 1582 г.)
Для дат, более поздних, чем 15 октября 1582 г., конверсия, кажется, работает нормально.
... Но вокруг пропущенного диапазона начинается DateTime (или, скорее,не начать) действовать смешно
var timespan = new DateTime(1582, 10, 15) - new DateTime(1582, 10, 4);
возвращаетTimeSpan
11 дней, поэтому дыра не учитывается операторами DateTime. Что дает? Я думал, что базовая реализация основана на.System.Globalization.GregorianCalendar