Я играю с новым пакетом java.time в Java 8. У меня есть устаревшая база данных, которая дает мне java.util.Date
, который я конвертирую в Instant
.
Я пытаюсь добавить период времени, основанный на другом флаге базы данных. Я мог бы добавить дни, недели, месяцы или годы. Мне не нужно беспокоиться о том, что я добавляю, и я хотел бы иметь возможность добавлять больше опций в будущем.
Моей первой мыслью было Instant.plus()
, но это дает мне UnsupportedTemporalTypeException
для значений больше одного дня. Очевидно, Instant не поддерживает операции с большими единицами времени. Хорошо, что угодно, LocalDateTime
делает.
Итак, это дает мне этот код:
private Date adjustDate(Date myDate, TemporalUnit unit){
Instant instant = myDate.toInstant();
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
dateTime = dateTime.plus(1, unit);
Instant updatedInstant = dateTime.atZone(ZoneId.systemDefault()).toInstant();
return new Date(dueInstant.toEpochMilli());
}
Я впервые использую API нового времени, так что, возможно, я что-то здесь упустил. Но мне кажется неуклюжим, что я должен идти:
Date --> Instant --> LocalDateTime --> do stuff--> Instant --> Date.
Даже если бы мне не пришлось использовать часть даты, я все равно подумал бы, что это было немного неудобно. Итак, мой вопрос заключается в следующем: я делаю это совершенно неправильно и как лучше всего это сделать?
Изменить: разверните обсуждение в комментариях.
Я думаю, что теперь у меня есть лучшее представление о том, как LocalDateTime и Instant играют с java.util.Date и java.sql.Timestamp. Спасибо всем.
Теперь более практическое рассмотрение. Допустим, пользователь отправляет мне дату из любой точки мира, в произвольном часовом поясе. Они присылают мне 2014-04-16T13:00:00
, который я могу проанализировать в LocalDateTime. Затем я конвертирую это напрямую в java.sql.Timestamp и сохраняю в своей базе данных.
Теперь, ничего не делая, я извлекаю свой java.sql.timestamp из своей базы данных, конвертирую в LocalDateTime
с помощью timestamp.toLocalDateTime()
. Все хорошо. Затем я возвращаю это значение своему пользователю, используя форматирование ISO_DATE_TIME. Результат 2014-04-16T09:00:00
.
Я предполагаю, что это различие связано с некоторым типом неявного преобразования в / из UTC. Я думаю, что мой часовой пояс по умолчанию может применяться к значению (EDT, UTC-4), что объясняет, почему число отключено на 4 часа.
Новый вопрос (ы). Где здесь происходит неявное преобразование местного времени в UTC? Как лучше сохранить часовые пояса. Не следует ли мне напрямую переходить от местного времени в виде строки (2014-04-16T13: 00: 00) к LocalDateTime
? Должен ли я ожидать часовой пояс от пользовательского ввода?
Instant
не логически знает о календарной системе - это просто момент времени, поэтому добавление месяца к нему не имеет смысла. Вам также следует тщательно обдумать, действительно ли вы действительно хотите использовать системный часовой пояс - хотите ли вы получать разные результаты для одних и тех же значений в зависимости от того, где вы работаете? - person Jon Skeet   schedule 01.04.2014java.sql.Timestamp
имеетtoLocalDateTime()
< / a> и статический _ 3_. Не должно быть необходимости использоватьInstant
в качестве посредника. - person Mark Rotteveel   schedule 02.04.2014