Как получить текущую дату / время в Java - PullRequest
640 голосов
/ 03 марта 2011

Какой лучший способ получить текущую дату / время в Java?

Ответы [ 26 ]

612 голосов
/ 03 марта 2011

Это зависит от того, какую форму даты / времени вы хотите:

  • Если вы хотите, чтобы дата / время представляли собой одно числовое значение, то System.currentTimeMillis() дает вам это, выраженное какколичество миллисекунд после эпохи UNIX (как Java long).Это значение является дельтой времени UTC и не зависит от местного часового пояса ... при условии, что системные часы установлены правильно.

  • Если вы хотитеДата / время в форме, позволяющей получить численный доступ к компонентам (год, месяц и т. д.), вы можете использовать один из следующих вариантов:

    • new Date() дает вам Date объект инициализирован с текущей датой / временем.Проблема заключается в том, что методы Date API в основном ошибочны ... и устарели.

    • Calendar.getInstance() дает вам объект Calendar, инициализированный с текущей датой / временем, используяпо умолчанию Locale и TimeZone.Другие перегрузки позволяют использовать определенные Locale и / или TimeZone.Календарь работает ... но API все еще громоздки.

    • new org.joda.time.DateTime() дает вам объект Joda-time , инициализированный с текущей датой / временем, используячасовой пояс по умолчанию и хронология.Есть много других альтернатив Joda ... слишком много, чтобы описать здесь.(Но обратите внимание, что некоторые люди сообщают, что время Joda имеет проблемы с производительностью; например, LocalDateTime Jodatime работает медленно при первом использовании .)

    • в Java 8, вызываяLocalDateTime.now() и ZonedDateTime.now() предоставят вам представление 1 для текущей даты / времени.

До Java 8 большинство людей, которые знают об этих вещах, рекомендовали Joda-time как имеющие (безусловно) лучшие API Javaдля выполнения операций, связанных с расчетом времени и продолжительности.С Java 8 это больше не так.Однако, если вы уже используете Joda time в своей кодовой базе, нет веских 2 причин для миграции.


1 - обратите внимание, что LocalDateTime не включаетчасовой пояс.Как говорит Javadoc: «Он не может представлять момент на временной шкале без дополнительной информации, такой как смещение или часовой пояс».

2 - Вашкод не сломается, если вы этого не сделаете, и вы не получите предупреждения об устаревании.Конечно, кодовая база Joda, вероятно, перестанет получать обновления, но вряд ли они понадобятся.Отсутствие обновлений означает стабильность, и это хорошая вещь.Также обратите внимание, что весьма вероятно, что если это , то кто-то исправит проблемы, вызванные регрессиями на платформе Java.

385 голосов
/ 05 августа 2011

Если вам просто нужно вывести отметку времени в формате YYYY.MM.DD-HH.MM.SS (очень частый случай), то вот способ сделать это:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
98 голосов
/ 07 октября 2013

Если вы хотите использовать текущую дату в виде строки, попробуйте следующее:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

или

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

69 голосов
/ 07 октября 2014

В Java 8 это:

LocalDateTime.now()

и, если вам нужна информация о часовом поясе:

ZonedDateTime.now()

и в случае, если вы хотите напечатать необычно отформатированную строку:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))
45 голосов
/ 03 марта 2011

Просто создайте объект Date ...

Date date = new Date();
41 голосов
/ 06 ноября 2014
    // 2015/09/27 15:07:53
    System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 15:07:53
    System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 09/28/2015
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

    // 20150928_161823
    System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) );

    // Mon Sep 28 16:24:28 CEST 2015
    System.out.println( Calendar.getInstance().getTime() );

    // Mon Sep 28 16:24:51 CEST 2015
    System.out.println( new Date(System.currentTimeMillis()) );

    // Mon Sep 28
    System.out.println( new Date().toString().substring(0, 10) );

    // 2015-09-28
    System.out.println( new java.sql.Date(System.currentTimeMillis()) );

    // 14:32:26
    Date d = new Date();
    System.out.println( (d.getTime() / 1000 / 60 / 60) % 24 + ":" + (d.getTime() / 1000 / 60) % 60 + ":" + (d.getTime() / 1000) % 60 );

    // 2015-09-28 17:12:35.584
    System.out.println( new Timestamp(System.currentTimeMillis()) );

    // Java 8

    // 2015-09-28T16:16:23.308+02:00[Europe/Belgrade]
    System.out.println( ZonedDateTime.now() );

    // Mon, 28 Sep 2015 16:16:23 +0200
    System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) );

    // 2015-09-28
    System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

    // 16
    System.out.println( LocalTime.now().getHour() );

    // 2015-09-28T16:16:23.315
    System.out.println( LocalDateTime.now() );
36 голосов
/ 08 сентября 2016

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.Ниже приведена более подробная информация.

enter image description here

Часовой пояс

Другие ответы не объясняют, как часовой пояс имеет решающее значение при определениитекущая дата и время.В любой данный момент даты и время меняются по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи новый день в Париже Франция остается «вчера» в Монреале Квебеке .

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: получение текущей даты и времени с сервера, а не системных часов и мой ответ .

photo of a couple of external radio clock devices

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?

  • Java SE 8 , Java SE 9 и выше
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

18 голосов
/ 18 марта 2013

Использование:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );

(это работает.)

15 голосов
/ 03 марта 2011

Существует много различных методов:

10 голосов
/ 11 июня 2013

Создайте объект даты и просто распечатайте его.

Date d = new Date(System.currentTimeMillis());
System.out.print(d);
...