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


342

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

Я шукаю щось еквівалентне DateTime.NowC #.


Це питання є старшим за це, яке раніше було позначене як дублікат. Тож я змінив позначення, повторно відкривши це запитання і позначивши новітнє як дублікат.
Василь Бурк

Відповіді:


414

Просто побудуйте новий Dateоб’єкт без жодних аргументів; це призначить поточну дату та час новому об'єкту.

import java.util.Date;

Date d = new Date();

Словами Javadocs для конструктора нульових аргументів :

Виділяє об'єкт Date і ініціалізує його так, щоб він представляв час, в який він був виділений , вимірюється до найближчої мілісекунди.

Переконайтеся, що ви використовуєте, java.util.Dateа ні java.sql.Date- останній не має конструктора з нульовим аргументом і має дещо іншу семантику, яка є темою зовсім іншої розмови. :)


13
Також зауважте, що GregorianCalendar та багато подібних об’єктів працюють однаково. Отже, незалежно від типу об’єкта дати / календаря, з яким ви працюєте, конструктор з нульовим аргументом зазвичай ініціалізує об'єкт до поточної дати / часу.
Пітер Ді Секко

Від дати док .: Станом на JDK 1.1, клас Календар повинен використовуватися для перетворення між полями дати та часу, а клас DateFormat слід використовувати для форматування та розбору рядків дати.
Паоло М

9
Зверніть увагу на нові API Java8 - LocalDateTime.now () та ZonedDateTime.now ()
Олег Міхеєв

59

Класи Java Date та Calendar багато хто вважає погано розробленими. Погляньте на Joda Time - бібліотеку, яка зазвичай використовується замість вбудованих бібліотек дат Java.

Еквівалент DateTime.Nowчасу Joda Time:

DateTime dt = new DateTime();

Оновлення

Як зазначається в коментарях, останні версії Joda Time мають DateTime.now()метод, так що:

DateTime dt = DateTime.now();

4
Поточна (2.1) версія Joda, здається, має статичний метод DateTime.now () (необов'язково приймає DateTimeZone або Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Роман А. Тейчер

1
Зауважте, що ця відповідь була опублікована в 2010 році. Java 8 увібрала в себе багато найкращих можливостей Joda Time. Додаткову інформацію див. В офіційній документації та багатьох інших онлайн-статтях.
DavidS

36

тл; д-р

Instant.now()

java.time

Класс java.util.Date був застарілий новим пакетом java.time ( Підручник ) у Java 8 та новіших версіях. Старі класи java.util.Date/.Calendar, як відомо, є клопітливими, заплутаними та хибними. Уникайте їх.

ZonedDateTime

Отримайте поточний момент у java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimeинкапсулирует:

  • Дата.
  • Час дня, з часткою секунди до наносекундної роздільної здатності.
  • Часовий пояс.

Якщо не вказаний часовий пояс, поточний часовий пояс вашого JVM за замовчуванням призначається безшумно. Краще вказати бажаний / очікуваний часовий пояс, ніж неявно покладатися на дефолт.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

Як правило, краще скористатись своєю роботою (бізнес-логіка, база даних, сховище, обмін даними) все в часовому поясі UTC . Наведений вище код неявно покладається на поточний часовий пояс JVM за замовчуванням.

InstantКлас являє собою момент на часовій шкалі в UTC з дозволом наносекунд.

Instant instant = Instant.now();

InstantКлас є основним класом многокомпонентного в java.time і часто можна використовувати в коді.

Коли вам потрібна більша гнучкість у форматуванні, перетворіться на OffsetDateTime. Вкажіть ZoneOffsetоб’єкт. Для UTC використовуйте зручну константу для UTC .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

Часовий пояс

Ви легко налаштуєтеся на інший часовий пояс для презентації користувачеві. Використовуйте належну назву часового поясу , ніколи 3-4 буквені коди, такі як ESTабо IST.

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

Створення рядкового представлення цього значення часу та дати, локалізованого.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

Або, щоб залишитися в UTC, використовуйте Instant. InstantОб'єкт являє собою момент на часовій шкалі, до наносекундному вирішенню, завжди в UTC. Це забезпечує будівельний блок для зонованого часу дати, а також призначення часового поясу. Ви можете подумати про це концептуально таким чином:

ZonedDateTime= Instant+ZoneId

Ви можете витягнути Instantз ZonedDateTime.

Instant instantNow = zdt.toInstant();

Ви можете почати з Миттєвого пошуку. Тут не потрібно вказувати часовий пояс, як Instantце завжди в UTC.

Instant now = Instant.now();

Я також розмістив ще одну відповідь з більш детальною інформацією про повторне запитання.
Василь Бурк



12
import java.util.Date;   
Date now = new Date();

Зауважте, що об'єкт Date є змінним, і якщо ви хочете зробити щось складніше, використовуйте jodatime .


10

java.lang.System.currentTimeMillis(); поверне дату з епохи


Підходить для ведення журналів, але вимагає розбору та перетворення для відображення користувачеві
Rishi Dua


5

Якщо ви створюєте новий об'єкт дати, за замовчуванням він буде встановлений на поточний час:

import java.util.Date;
Date now = new Date();

3

Java завжди отримувала неадекватну підтримку для випадків використання дати та часу. Наприклад, існуючі класи (такі як java.util.Dateі SimpleDateFormatter) не є безпечними для потоків, що може призвести до проблем одночасності. Також в API є певні вади. Наприклад, роки java.util.Dateпочинаються з 1900 року, місяці починаються з 1, а дні починаються з 0 - не дуже інтуїтивно. Ці питання призвели до популярності сторонніх бібліотек дат і часу, таких як Joda-Time. Для вирішення нової дати та часу API розроблений для Java SE 8.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Відповідно до документа :

Метод now()повертає поточну дату-час за допомогою системного годинника та часового поясу за замовчуванням, не нульовим . Він отримує поточну дату-час із системних годин у часовому поясі за замовчуванням. Це запитає системний годинник у часовому поясі за замовчуванням, щоб отримати поточний час-дату. Використання цього методу запобіжить можливість використання альтернативного годинника для тестування, оскільки годинник жорстко закодований.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.