Проблема преобразования миллисекунд с эпохи в календарную дату до 1582 г. - PullRequest
0 голосов
/ 20 мая 2019

Мне нужно получить дату из эластичного поиска, которая хранится как 14 мая-1581 года в Java.У меня есть дата от упора поиска в миллисекундах (-12264134400000).При преобразовании в дату в Java дата вычисляется неправильно.Я знаю, что это связано с грузинским и юлианским календарем, но не могу найти решение для этого.Код, который я использую, просто:

Date dt = new Date(-12264134400000L);

Выше приведено 04-мая-1581 вместо 14-мая-1581.

Чтобы дать более подробную информацию, у меня много таких датвнесены в базу данных Oracle, которая перемещается в Elasticsearch.Я получаю дату от Elasticsearch за миллисекунды (это то, как она читает из индекса lucene. Рассмотрим это как ограничение).Поэтому я хочу преобразовать миллисекунды обратно в исходную дату, чтобы сравнить ее с другой датой.Так что, еслиasticsearch преобразован 14 мая 1581 года в -12264134400000, я хочу вернуть 14 мая 1581 года.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

То, как я получаю дату от Elasticsearch, - в миллисекундах (это то, как оно читает из индекса lucene. Рассмотрим это как ограничение).

Я бы переосмыслил необходимостьиз ограничений, которые вы упоминаете.Кто навязывает это и почему?

Работа с моментами в миллисекундах с или до эпохи Unix приемлема для моментов времени после (примерно) 1950 года, но вы настраиваете себя намножество проблем путем преобразования исторических дат шестнадцатого века в миллисекунды;включая, но не ограничиваясь, выяснение, какой часовой пояс использовать, и как убедиться, что один и тот же часовой пояс используется как на стороне, которая преобразует ваши даты в миллисекунды, так и на стороне, которая преобразует их обратно в даты.Как ElasticSearch преобразует вашу дату в метку времени в миллисекундах?

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

Если вам нужен промежуточный формат для передачи этих дат, используйте календарные даты ISO 8601 в строковой нотации YYYY-MM-DD из YYYYMMDD.По крайней мере, это означает, что их сортировка работает «из коробки».

Для работы с историческими датами в Java начните с java.time пакета , представленного в Java 8 (как упомянуто @sharon-ben-ашер).

1 голос
/ 20 мая 2019

Вы должны использовать пакет java.time, представленный в Java 8:

LocalDate date = 
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

это дает ожидаемые результаты

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