Как узнать текущую дату и время

342

Как узнать текущую дату и время на Java?

Я ищу что-то эквивалентное DateTime.Nowиз C #.

mrblah
источник
Этот Вопрос старше, чем этот Вопрос, ранее помеченный как дубликат. Поэтому я поменял обозначение, снова открыв этот Вопрос и пометив новый как дубликат.
Базилик Бурк

Ответы:

414

Просто создайте новый Dateобъект без каких-либо аргументов; это назначит текущую дату и время новому объекту.

import java.util.Date;

Date d = new Date();

По словам Javadocs для конструктора с нулевым аргументом :

Выделяет объект Date и инициализирует его так, чтобы он представлял время, в которое он был выделен , с точностью до миллисекунды.

Убедитесь, что вы используете, java.util.Dateа не java.sql.Date- последний не имеет конструктора с нулевым аргументом и имеет несколько другую семантику, которая является темой совершенно другого разговора. :)

delfuego
источник
13
Также обратите внимание, что GregorianCalendar и многие похожие объекты работают одинаково. Поэтому, независимо от типа объекта даты / календаря, с которым вы работаете, конструктор с нулевым аргументом обычно инициализирует объект текущей датой / временем.
Питер Ди Чекко
С даты документа: Начиная с JDK 1.1, класс Calendar должен использоваться для преобразования между полями даты и времени, а класс 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();
cdmckay
источник
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();

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

  • Дата.
  • Время суток с долей секунды до наносекунды .
  • Часовой пояс.

Если часовой пояс не указан, текущий часовой пояс по умолчанию для вашей JVM назначается автоматически. Лучше указать желаемый / ожидаемый часовой пояс, чем неявно полагаться на значение по умолчанию.

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

универсальное глобальное время

Как правило, лучше привыкнуть выполнять свою внутреннюю работу (бизнес-логика, база данных, хранилище, обмен данными) в часовом поясе 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();
Базилик Бурк
источник
Я также опубликовал еще один ответ с более подробной информацией о дублирующихся Вопросах.
Базилик Бурк
16

Я предпочитаю использовать объект календаря.

Calendar now = GregorianCalendar.getInstance()

Мне намного легче работать. Вы также можете получить объект Date из календаря.

http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html

Ральф
источник
4
Или это может быть простоCalendar.getInstance()
рисовать
14

В Java 8 это:

ZonedDateTime dateTime = ZonedDateTime.now();
Виталий Федоренко
источник
12
import java.util.Date;   
Date now = new Date();

Обратите внимание, что объект Date является изменчивым, и если вы хотите сделать что-то сложное, используйте jodatime .

Чандра Патни
источник
10

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

user243773
источник
Хорошо для регистрации, но требует разбора и преобразования для отображения пользователю
Rishi Dua
6
import org.joda.time.DateTime;

DateTime now = DateTime.now();
Горди
источник
5

Если вы создаете новый объект Date, по умолчанию он будет установлен на текущее время:

import java.util.Date;
Date now = new Date();
parkerfath
источник
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()возвращает текущую дату и время, используя системные часы и часовой пояс по умолчанию, а не ноль . Он получает текущую дату и время из системных часов в часовом поясе по умолчанию. Это запросит системные часы в часовом поясе по умолчанию, чтобы получить текущую дату и время. Использование этого метода предотвратит возможность использовать альтернативные часы для тестирования, потому что часы жестко запрограммированы.

akhil_mittal
источник