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.