tl; dr
java.util.Date.from(
Instant.now() ;
)
Хотя в приведенном выше коде не было смысла. Оба java.util.Date
и Instant
представляют момент в формате UTC, всегда в формате UTC. Код выше имеет такой же эффект, как:
new java.util.Date()
Здесь нет пользы от использования ZonedDateTime
. Если у вас уже есть ZonedDateTime
, настройтесь на UTC, извлекая Instant
.
java.util.Date.from(
myZonedDateTime.toInstant()
)
Другой ответ правильный
Ответ на ssoltanid правильно обращается ваш конкретный вопрос, как преобразовать новую школу java.time объект ( ZonedDateTime
) для старой школы java.util.Date
объекта. Извлеките Instant
из ZonedDateTime и перейдите к java.util.Date.from()
.
Потеря данных
Обратите внимание, что вы столкнетесь с потерей данных , поскольку Instant
отслеживает наносекунды с эпохи, а java.util.Date
отслеживает миллисекунды с эпохи.
Ваш вопрос и комментарии поднимают другие вопросы.
Хранить серверы в UTC
На ваших серверах обычно должна быть установлена ОС хоста в формате UTC. JVM выбирает этот параметр ОС хоста в качестве часового пояса по умолчанию в реализациях Java, о которых я знаю.
Укажите часовой пояс
Но никогда не следует полагаться на текущий часовой пояс JVM по умолчанию. Вместо того, чтобы выбирать настройку хоста, флаг, переданный при запуске JVM, может установить другой часовой пояс. Еще хуже: любой код в любом потоке любого приложения в любой момент может позвонить, java.util.TimeZone::setDefault
чтобы изменить это значение по умолчанию во время выполнения!
Timestamp
Тип Кассандры
Любая достойная база данных и драйвер должны автоматически обрабатывать настройку прошедшей даты и времени на UTC для хранения. Я не использую Cassandra, но, похоже, у него есть элементарная поддержка даты и времени. В документации указано, что его Timestamp
тип - это количество миллисекунд той же эпохи (первый момент 1970 года по UTC).
ISO 8601
Кроме того, Cassandra принимает строковые входные данные в стандартных форматах ISO 8601 . К счастью, java.time использует форматы ISO 8601 по умолчанию для синтаксического анализа / генерации строк. Реализация Instant
класса toString
подойдет.
Точность: миллисекунда против наношнура
Но сначала нам нужно уменьшить наносекундную точность ZonedDateTime до миллисекунд. Один из способов - создать новый Instant за миллисекунды. К счастью, в java.time есть несколько удобных методов для преобразования в миллисекунды и обратно.
Пример кода
Вот пример кода в Java 8 (обновление 60).
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
Instant instant = zdt.toInstant();
Instant instantTruncatedToMilliseconds = Instant.ofEpochMilli( instant.toEpochMilli() );
String fodderForCassandra = instantTruncatedToMilliseconds.toString();
Или, согласно этому документу драйвера Cassandra Java , вы можете передать java.util.Date
экземпляр (не путать с java.sqlDate
). Таким образом, вы можете сделать juDate из этого instantTruncatedToMilliseconds
в приведенном выше коде.
java.util.Date dateForCassandra = java.util.Date.from( instantTruncatedToMilliseconds );
Если делать это часто, можно сделать однострочник.
java.util.Date dateForCassandra = java.util.Date.from( zdt.toInstant() );
Но было бы аккуратнее создать небольшой служебный метод.
static public java.util.Date toJavaUtilDateFromZonedDateTime ( ZonedDateTime zdt ) {
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
Обратите внимание на разницу во всем этом коде, чем в вопросе. Код вопроса пытался изменить часовой пояс экземпляра ZonedDateTime на UTC. Но в этом нет необходимости. Концептуально:
ZonedDateTime = Мгновенно + ZoneId
Мы просто извлекаем часть Instant, которая уже находится в UTC (в основном в UTC, подробности читайте в документации класса).
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
занятиях.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .
java.util.Date
иjava.sql.Date
.