ТЛ; др
ZonedDateTime.now( // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "America/Montreal" ) // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMinute() // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.
42
ZonedDateTime
Чтобы запечатлеть текущий момент, который виден на часах настенного времени, используемых людьми определенного региона (часового пояса), используйте ZonedDateTime
.
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще «вчера» в Монреаль Квебек .
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше указать в качестве аргумента ваш желаемый / ожидаемый часовой пояс .
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
Позвоните любому из множества добытчиков, чтобы вытащить кусочки даты и времени.
int year = zdt.getYear() ;
int monthNumber = zdt.getMonthValue() ;
String monthName = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ; // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int dayOfMonth = zdt.getDayOfMonth() ;
String dayOfWeek = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
int hour = zdt.getHour() ; // Extract the hour from the time-of-day.
int minute = zdt.getMinute() ;
int second = zdt.getSecond() ;
int nano = zdt.getNano() ;
Классы java.time разрешают до наносекунд . Ваш вопрос задан за долю секунды в миллисекундах . Очевидно, что вы можете разделить на миллион, чтобы сократить наносекунды до миллисекунд, за счет возможной потери данных. Или используйте перечисление TimeUnit
для такого преобразования.
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatter
Чтобы создать String
для объединения фрагментов текста, используйте класс DateTimeFormatter
. Поиск переполнения стека для получения дополнительной информации об этом.
Instant
Обычно лучше всего отслеживать моменты в UTC. Чтобы перейти от зонированной даты и времени к UTC, извлеките Instant
.
Instant instant = zdt.toInstant() ;
И вернитесь снова.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDateTime
Несколько других Ответов используют класс LocalDateTime
. Этот класс не соответствует цели отслеживания фактических моментов, конкретных моментов на временной шкале, поскольку в нем намеренно отсутствует какое-либо понятие часового пояса или смещения от UTC.
Так, для чего LocalDateTime
хорош? Используйте LocalDateTime
, когда вы собираетесь применить дату и время к любому населённому пункту или всем населённым пунктам , а не одному конкретному населённому пункту.
![image](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Kiribati_on_the_globe_%28Polynesia_centered%29.svg/240px-Kiribati_on_the_globe_%28Polynesia_centered%29.svg.png)
Например, Рождество в этом году начинается с LocalDateTime.parse( "2018-12-25T00:00:00" )
. Это значение не имеет смысла, пока вы не примените часовой пояс (ZoneId
), чтобы получить ZonedDateTime
. Рождество наступает сначала в Кирибати , а затем в Новой Зеландии и на Дальнем Востоке Азии. Несколько часов спустя Рождество начинается в Индии. Еще час спустя в Африке и Европе. И все же не Рождество в Америке, пока несколько часов спустя. Рождество, начинающееся в любом одном месте, должно быть обозначено ZonedDateTime
. Рождество везде обозначено LocalDateTime
.
О 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?