Ошибка вычисления при представлении TDateTime (Delphi) как объекта календаря Java - PullRequest
3 голосов
/ 18 января 2012

Delphi TDateTime эпоха 30 декабря 1899 г. , Java Calendar использует эпоху Unix, 1 января 1970 г. .Следующий код:

Calendar epoch = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
epoch.set(1899, 12, 30, 0, 0, 0);
epoch.getTimeInMillis();

дает -2206483199054 , но согласно ручным расчетам это должно быть -2209161600000 .Откуда берется дельта 2678400946 (31 день)?Что мне не хватает?

Да, теперь я могу работать с миллисекундами в качестве обходного пути, но я хочу знать, откуда возникает ошибка.

PS epoch - это экземпляр java.util.GregorianCalendar.

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Поле месяца основано на 0, поэтому декабрь - это месяц 11, а не 12. Это объясняет, почему у вас нет работы на 31 день - вы завершили работу до 30 января 1900 года. Вы можете позвонить setLenient(false) чтобы иногда отлавливать такую ​​ошибку.

Метод set устанавливает только шесть полей, упомянутых в аргументах; он оставляет другие поля без изменений, в том числе миллисекундные, что объясняет, почему вы на самом деле отключены на немного больше , чем на 31 день.

В документации рекомендуется сначала позвонить clear(), но вместо этого вы можете предпочесть clear(Calendar.MILLISECOND), чтобы сохранить информацию о часовом поясе без изменений.

3 голосов
/ 18 января 2012

вместо

epoch.set(1899, 12, 30, 0, 0, 0);

использование

epoch.set(1899, Calendar.DECEMBER, 30, 0, 0, 0);

потому что номер месяца начинается с нуля (0 = ЯНВАРЬ)

Результат равен -2209161600000 (JDK 1.6), когда миллисекунды также установлены на 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...