Мне нужно преобразовать .NET DateTime
в эквивалентное представление Java Calendar
.Конвертировать дату между java и .net - 2 дн.
В .NET DateTime
использует Ticks
так Jan 1 0001 (в .NET эпохи) в качестве лежащего в основе представления.
Java GregorianCalendar
использует миллисекунды с 1 января 1970 г. (эпоха Java (или Unix)). Значение отрицательное для дат до эпохи Java, как и ожидалось.
Здесь я преобразуя DateTime
представление в Millis с Java эпохи:
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//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//0001
Я думаю, мой вопрос: Как я Я должен получить действительное значение в миллисекундах из DateTime, из которого я могу правильно построить Java-календарь?
... с подразумеваемым подзапросом «что здесь происходит?»
EDIT: Я играл с 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
.
Что делать, если вы используете [Joda Time] (http://joda-time.sourceforge.net/)? Ты можешь? Время в Joda улучшает стандартные даты Java и может потенциально решить вашу проблему чистым способом. Он также обеспечивает конверсии в java.util.Date и java.util.Calendar, поэтому, если вам действительно нужно использовать стандартные даты Java, вы можете использовать преобразование времени Joda для преодоления вашей проблемы. – ThanksForAllTheFish
Это немного похоже на убийство мух с помощью пушки. То, что я * мог * сделать, - это изменить бит Java для вызова calendar.Set (год, месяц, день, ...) вместо calendar.SetTimeInMillis() и получить каждое из этих полей из свойств объекта .NET DateTime. Но я также хочу понять, что происходит. –
Кстати, проблема, похоже, на стороне .NET рассказа - и большой JS портировал свою библиотеку на .NET: https://code.google.com/p/noda-time/ (v 1.1 выпущен просто дней назад!) –