tl;dr
java.util.Date.from( // Transfer the moment in UTC, truncating any microseconds or nanoseconds to milliseconds.
Instant.now() ; // Capture current moment in UTC, with resolution as fine as nanoseconds.
)
Хотя в приведенном выше коде не было никакого смысла. Оба java.util.Date
и Instant
представляют момент в формате UTC, всегда в формате UTC. Код выше имеет тот же эффект, что и:
new java.util.Date() // Capture current moment in UTC.
Здесь нет никакой пользы от использования ZonedDateTime
. Если у вас уже есть ZonedDateTime
, настройтесь на UTC, извлекая Instant
.
java.util.Date.from( // Truncates any micros/nanos.
myZonedDateTime.toInstant() // Adjust to UTC. Same moment, same point on the timeline, different wall-clock time.
)
Другой ответ правильный
Ответ от ssoltanid правильно отвечает на ваш конкретный вопрос, как преобразовать объект java.time новой школы (ZonedDateTime
) в объект старой школы _ 10_. Извлеките Instant
из ZonedDateTime и перейдите к _ 12_.
Потери данных
Обратите внимание, что вы потерпите потерю данных, поскольку Instant
отслеживает наносекунды с эпоха, а java.util.Date
отслеживает миллисекунды с эпохи.
![диаграмма сравнения разрешений миллисекунды, микросекунды и наносекунды](https://i.stack.imgur.com/tGIpx.png)
Ваш вопрос и комментарии вызывают другие проблемы.
Хранить серверы в UTC
На ваших серверах обычно должна быть установлена ОС хоста в формате UTC. JVM выбирает этот параметр ОС хоста в качестве часового пояса по умолчанию в известных мне реализациях Java.
Укажите часовой пояс
Но никогда не следует полагаться на текущий часовой пояс JVM по умолчанию. Вместо того, чтобы выбирать настройку хоста, флаг, переданный при запуске JVM, может установить другой часовой пояс. Еще хуже: любой код в любом потоке любого приложения в любой момент может вызвать _ 15_, чтобы изменить это значение по умолчанию во время выполнения!
Кассандра Timestamp
Тип
Любая достойная база данных и драйвер должны автоматически выполнять настройку прошедшей даты и времени на UTC для хранения. Я не использую Cassandra, но, похоже, у него есть элементарная поддержка даты и времени. В документации указано, что его тип Timestamp
- это количество миллисекунд. из той же эпохи (первый момент 1970 г. по всемирному координированному времени).
ISO 8601
Кроме того, Cassandra принимает строковые входные данные в стандартных форматах ISO 8601. К счастью, java.time использует форматы ISO 8601 по умолчанию для синтаксического анализа / генерации строк. Класс Instant
'_ 19_ подойдет.
Точность: миллисекунда против наношнура
Но сначала нам нужно уменьшить наносекундную точность 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(); // Example: 2015-08-18T06:36:40.321Z
Или в соответствии с этим Cassandra Java driver doc, вы можете передать java.util.Date
экземпляр (не путать с java.sqlDate
) . Таким образом, вы можете создать j.u.Date из этого 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();
// Data-loss, going from nanosecond resolution to milliseconds.
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
Обратите внимание на разницу во всем этом коде, чем в вопросе. Код вопроса пытался изменить часовой пояс экземпляра ZonedDateTime на UTC. Но в этом нет необходимости. Концептуально:
ZonedDateTime = Мгновенно + ZoneId
Мы просто извлекаем часть Instant, которая уже находится в UTC (в основном в UTC, подробности читайте в документации по классу).
![Таблица типов даты и времени в Java, как современных, так и устаревших](https://i.stack.imgur.com/4Hxko.png)
О java.time
java.time framework встроена в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 27_, _ 28_, & _ 29_.
Проект Joda-Time теперь в режим обслуживания, советует перейти на java.time классы.
Чтобы узнать больше, см. Учебник Oracle . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.
Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
![Таблица того, какая библиотека java.time использовать с какой версией Java или Android](https://i.stack.imgur.com/JV8ms.png)
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например _31 _, YearWeek
, _ 33_ и подробнее.
person
Basil Bourque
schedule
28.08.2015
java.util.Date
иjava.sql.Date
. - person Basil Bourque   schedule 28.08.2015