Донецкий техникум промышленной автоматики

Як отримати поточну дату / час в Java

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. Нижче трохи більше інформації.

Інші відповіді не пояснюють, як часовий пояс має вирішальне значення при визначенні поточної дати і часу. У будь-який момент часу дата і час варіюються по всій земній кулі в залежності від зони. Наприклад, кілька хвилин після опівночі - це новий день в Парижі, Франція, хоча він залишається "вчора" в Монреалі-Квебеку .

Як правило, більшу частину вашої бізнес-логіки і зберігання / обміну даними слід виконувати в UTC . Щоб отримати поточний момент в UTC з дозволом в наносекундах , Використовуйте клас Instant .

Instant instant = Instant.now ();

Ви можете налаштувати, що Instant в інших часових поясах. застосуйте об'єкт ZoneId Щоб отримати ZonedDateTime .

ZoneId z = ZoneId.of ( "America / Montreal"); ZonedDateTime zdt = instant.atZone (z);

Ми можемо припустити Instant і отримати поточний ZonedDateTime безпосередньо.

ZonedDateTime zdt = ZonedDateTime.now (z);

Завжди передавайте цей необов'язковий аргумент часового поясу. Якщо опущений, застосовується поточний часовий пояс за умовчанням для ваших віртуальних машин Java. Значення за замовчуванням може змінитися в будь-який момент, навіть під час виконання. Не піддавайте ваш додаток зовнішніх впливів поза вашим контролем. Завжди вказуйте бажаний / очікуваний часовий пояс.

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 представляє значення тільки для дати без часу доби і без часового поясу.

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 .

Всупереч коментарю на питання від RamanSB, ви не повинні використовувати клас LocalDateTime для поточної дати і часу.

У LocalDateTime навмисно відсутня інформація про часовий пояс або зміщенні від UTC. Таким чином, це не підходить, коли ви відстежуєте певний момент на часовій шкалі. Звичайно, не підходить для захоплення поточного моменту.

"Локальна" формулювання нелогічна. Це означає будь-яку місцевість, а не одну конкретну місцевість. Наприклад, Різдво цього року починається опівночі 25 грудня: 2017-12-25T00: 00: 00, щоб бути представленим як LocalDateTime. Але це означає опівночі в різних точках земної кулі в різний час. Північ настає спочатку в Кірібаті , Пізніше в Новій Зеландії, ще кілька годин по тому в Індії і т.д., Ще кілька годин проходить до того, як Різдво починається у Франції, коли діти в Канаді все ще чекають цього дня. Кожна з цих точок початку Різдва буде представлена ​​у вигляді окремого ZonedDateTime.

Якщо ви не можете довіряти системним годинах, см. Java: Отримати поточну дату і час з сервера, а не системний годинник і моя відповідь .

Java: Отримати поточну дату і час з сервера, а не системний годинник   і   моя відповідь

Щоб використовувати альтернативного постачальника поточного моменту, напишіть підклас абстрактного класу java.time.Clock .

Ви можете передати свою реалізацію Clock як аргумент різним методам java.time. наприклад, Instant.now (clock) .

Instant instant = Instant.now (yourClockGoesHere);

З метою тестування зверніть увагу на альтернативні реалізації Clock доступні статично в самих Clock: fixed , Offset, tick та інші.

інфраструктура java.time вбудована в Java 8 і пізніші версії . Ці класи витісняти неприємні старі застарілі класи дати і часу, такі як java.util.Date , Calendar , і SimpleDateFormat .

проект Joda-Time , Який перебуває зараз в режимі обслуговування , Рекомендує перейти на класи java.time .

Щоб дізнатися більше, див. Підручник по Oracle . І пошук для багатьох прикладів і пояснень. Специфікація JSR 310 .

Ви можете обмінюватися об'єктами java.time безпосередньо з вашою базою даних. використовуйте драйвер JDBC, відповідний JDBC 4.2 або більш пізньої версії . Немає необхідності в рядках, немає необхідності в java.sql. *.

Де взяти класи java.time?

  • Java SE 8 , Java SE 9 і більш пізні
    • Вбудований.
    • Частина стандартного Java API з комплексної реалізацією.
    • Java 9 додає деякі незначні функції і виправлення.
  • Java SE 6 і Java SE 7
    • Велика частина функціональності java.time перенесена на Java 6 і 7 в ThreeTen-Backport .
  • Android

проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Тут ви можете знайти деякі корисні класи, такі як Interval , YearWeek , YearQuarter і інші .

Time?