тл; д-р
Instant.now() // Capture the current moment in UTC.
Створіть рядок, щоб представити це значення:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Деталі
Як правильну відповідь заявив Джон Скіт , об’єкт java.util.Date не має часового поясу † . Але його toString
реалізація застосовує часовий пояс за замовчуванням JVM під час генерації рядкового представлення цього значення дати та часу. Збиваючи з пантелику наївного програміста, дата, схоже, має часовий пояс, але не має.
В java.util.Date
, j.u.Calendar
і java.text.SimpleDateFormat
класи в комплекті з Java , як відомо , клопітка. Уникайте їх. Натомість використовуйте будь-яку з цих компетентних бібліотек дати:
java.time (Java 8)
Java 8 пропонує відмінний новий пакет java.time. * Для витіснення старих класів java.util.Date/Calendar.
Отримання поточного часу в UTC / GMT - це простий однолінійний ...
Instant instant = Instant.now();
Цей Instant
клас є основним будівельним блоком в java.time, що представляє момент на часовій шкалі в UTC з роздільною здатністю наносекунд .
У Java 8 поточний момент фіксується з роздільною здатністю до мілісекунд. Java 9 приносить свіжу реалізацію з Clock
захоплень поточного моменту в до повної наносекундной можливості цього класу, в залежності від здатності апаратних годин вашого головного комп'ютера.
Цей toString
метод генерує струнне представлення його значення, використовуючи один конкретний формат ISO 8601 . Цей формат виводить нуль, три, шість або дев'ять розрядів ( мілісекунд , мікросекунд або наносекунд ), як це необхідно для представлення частки секунди.
Якщо ви хочете більш гнучким форматуванням або іншими додатковими функціями, застосуйте зміщення з-за нуля UTC, щоб сам UTC ( ZoneOffset.UTC
постійний ) отримав а OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Дамп до консолі ...
System.out.println( "now.toString(): " + now );
Під час запуску…
now.toString(): 2014-01-21T23:42:03.522Z
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає необхідності в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
Joda-Time
ОНОВЛЕННЯ: Проект Joda-Time , який зараз знаходиться в режимі технічного обслуговування , радить перейти до класів java.time .
Використовуючи безкоштовну бібліотеку з відкритим кодом Joda-Time з безкоштовним коштом, ви можете отримати поточний час часу лише в одному рядку коду.
Joda-Time надихнув нові класи java.time. * На Java 8, але має іншу архітектуру. Ви можете використовувати Joda-Time у старих версіях Java. Joda-Time продовжує працювати в Java 8 і продовжує активно підтримуватися (станом на 2014 рік). Однак команда Joda-Time радить міграцію до java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Більш детальний приклад коду (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Дамп до консолі ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Під час запуску…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Для отримання додаткового прикладу роботи коду часового поясу дивіться мою відповідь на подібне запитання.
Часовий пояс
Я рекомендую вам завжди вказувати часовий пояс, а не посилатися неявно на поточний часовий пояс JVM за замовчуванням (який може змінитися в будь-який момент!). Таке сподівання, здається, є частою причиною плутанини та помилок у роботі з датою.
Під час дзвінка now()
передайте бажаний / очікуваний часовий пояс, який потрібно призначити. Використовуйте DateTimeZone
клас.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Цей клас містить константу для часового поясу UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Якщо ви справді хочете використовувати поточний часовий пояс JVM за замовчуванням, зробіть явний дзвінок, щоб ваш код був самодокументованим.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Прочитайте про формати ISO 8601 . І java.time, і Joda-Time використовують чутливі формати цього стандарту як свої за замовчуванням як для розбору, так і для створення рядків.
† На насправді, java.util.Date робить є часовий пояс, похований глибоко під шарами вихідного коду. У більшості практичних цілей цей часовий пояс ігнорується. Отже, як скорочено, ми говоримо java.util.Date не має часового поясу. Крім того, часовий пояс закопаного не є тим, що використовується методом Дате toString
; цей метод використовує поточний часовий пояс JVM за замовчуванням. Тим більше причин уникати цього заплутаного класу та дотримуватися Joda-Time та java.time.