tl; dr
Instant.now() // Capture the current moment in UTC, with a resolution of nanoseconds.
… или…
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
java.time
В нескольких ответах упоминается, что java.time *Классы 1010 * представляют собой современную замену проблемным старым классам даты и времени в комплекте с самыми ранними версиями Java.Ниже приведена более подробная информация.
Часовой пояс
Другие ответы не объясняют, как часовой пояс имеет решающее значение при определениитекущая дата и время.В любой данный момент даты и время меняются по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи новый день в Париже Франция остается «вчера» в Монреале Квебеке .
Instant
Большая часть вашей бизнес-логики и хранения / обмена данными должна выполняться в UTC , в качестве лучшей практики.Чтобы получить текущий момент в UTC с разрешением в наносекунд , используйте Instant
class.
Instant instant = Instant.now();
ZonedDateTime
Вы можете настроить Instant
на другие часовые пояса.Примените объект ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
. Мы можем пропустить Instant
и получить текущий ZonedDateTime
напрямую.
ZonedDateTime zdt = ZonedDateTime.now( z );
Всегда передавайте этот необязательный аргумент часового пояса.Если опущен, применяется текущий часовой пояс JVM по умолчанию.Значение по умолчанию может измениться в любой момент, даже во время выполнения.Не подвергайте ваше приложение внешним воздействиям вне вашего контроля.Всегда указывайте желаемый / ожидаемый часовой пояс.
ZonedDateTime do_Not_Do_This = ZonedDateTime.now(); // BAD - Never rely implicitly on the current default time zone.
Позже вы можете извлечь Instant
из ZonedDateTime
.
Instant instant = zdt.toInstant();
Всегда использовать Instant
или ZonedDateTime
вместо LocalDateTime
, когда вы хотите фактический момент на временной шкале.Типы Local…
намеренно не имеют понятия часового пояса, поэтому они представляют лишь приблизительное представление о возможном моменте.Чтобы получить фактический момент, вы должны назначить часовой пояс для преобразования типов Local…
в ZonedDateTime
и тем самым сделать его осмысленным.
LocalDate
LocalDate
* Класс 1088 * представляет значение только для даты без времени суток и без часового пояса.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z ); // Always pass a time zone.
Строки
Чтобы сгенерировать строку, представляющую значение даты и времени, простовызовите toString
для классов java.time для стандартных ISO 8601 форматов.
String output = myLocalDate.toString(); // 2016-09-23
… или…
String output = zdt.toString(); // 2016-09-23T12:34:56.789+03:00[America/Montreal]
Класс ZonedDateTime
расширяетсястандартный формат, разумно добавляя название часового пояса в квадратных скобках.
Для других форматов найдите Переполнение стека для многих вопросов и ответов в классе DateTimeFormatter
.
Избегайте LocalDateTime
Вопреки комментарию к RamanSB, вы должны не использовать LocalDateTime
класс для текущей даты-времени.
В LocalDateTime
преднамеренно отсутствует информация о часовом поясе или смещении от UTC.Так что это не уместно, когда вы отслеживаете определенный момент на временной шкале.Конечно, не подходит для захвата текущего момента.
«Местная» формулировка нелогична.Это означает любой населенный пункт, а не какой-либо один конкретный населенный пункт.Например, Рождество в этом году начинается в полночь 25 декабря: 2017-12-25T00:00:00
, которое должно быть представлено как LocalDateTime
.Но это означает полночь в разных точках земного шара в разное время.Полночь наступает сначала в Кирибати , позже в Новой Зеландии, еще несколько часов спустя в Индии и т. Д., Еще несколько часов проходит до того, как Рождество начинается во Франции, когда дети в Канаде все еще ждут этого дня.Каждая из этих рождественских стартовых точек будет представлена как отдельная ZonedDateTime
.
Из-за пределов вашей системы
Если вы не можете доверять системным часам, см. Java: получение текущей даты и времени с сервера, а не системных часов и мой ответ .
java.time.Clock
Для использованияАльтернативный поставщик текущего момента, напишите подкласс абстрактного java.time.Clock
класса.
Вы можете передать реализацию Clock
в качестве аргумента различным java.time методам. Например, Instant.now( clock )
.
Instant instant = Instant.now( yourClockGoesHere ) ;
В целях тестирования обратите внимание на альтернативные реализации Clock
, доступные статически из самого Clock
: fixed
, offset
, tick
и другие.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .