Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как получить текущую дату и время в Java
Введение В этой статье мы рассмотрим множество способов получить текущую дату и время в Java. Большинство приложений нуждаются в отметках времени событий или отображении даты / времени, среди многих других вариантов использования: * Когда мы публикуем блоги на веб-сайте, дата публикации записывается в базу данных и отображается читателю. * Когда мы совершаем действие, мы хотели бы знать, когда оно будет доступно, чтобы мы могли отслеживать их. * Когда мы покупаем что-то в Интернете или совершаем транзакцию, наш ba
Время чтения: 6 мин.
Вступление
В этой статье мы рассмотрим множество способов получить текущую дату и время в Java . Большинство приложений нуждаются в отметках времени событий или отображении даты / времени, среди многих других вариантов использования:
- Когда мы публикуем блоги на веб-сайте, дата публикации записывается в базу данных и отображается читателю.
- Когда мы совершаем действие, мы хотели бы знать, когда оно будет доступно, чтобы мы могли отслеживать их.
- Когда мы покупаем что-то в Интернете или совершаем транзакцию, наши банки предлагают нам список транзакций с точными отметками времени, чтобы мы могли их просмотреть.
Короче говоря, получение текущей даты и времени в Java очень важно и имеет множество применений, и, к счастью, это действительно легко получить для любого использования.
System.currentTimeMillis ()
Если вы хотите получить одно числовое значение миллисекунд, прошедших с эпохи UNIX , это так же просто, как:
Распечатка этого значения приведет к примерно следующему:
При преобразовании этого числа обратно в удобочитаемую дату оно представляет:
А чтобы сделать это на Java, нам понадобится всего пара строк кода:
Выполнение этого фрагмента кода даст:
Примечание: имейте в виду, что этот метод возвращает текущее значение в зависимости от вашего системного времени.
java.util.Date
В Java получить текущую дату так же просто, как создать экземпляр Date из пакета Java java.util :
Мы можем легко отформатировать эту дату:
И запуск этого фрагмента кода даст:
API календаря
Среди множества классов Java есть Calendar , который используется для преобразования даты и времени между конкретными моментами и полями календаря.
Получить текущую дату и время очень просто с помощью календаря:
Опять же, мы можем легко отформатировать это:
Метод getTime() возвращает объект Date Поскольку SimpleDateFormat работает только с Date , мы вызываем метод getTime() Calendar для его форматирования.
Выполнение этого фрагмента кода даст:
API даты / времени
Java 8 познакомила нас с совершенно новым API, который был включен в сборку для замены java.util.Date и java.util.Calendar .
По-прежнему полезно знать, как получить текущую дату и время с помощью двух предыдущих классов, поскольку не все приложения еще перешли на Java 8.
API даты / времени предоставляет несколько классов, на которые мы можем положиться при выполнении работы:
LocalDate
LocalDate представляет собой просто дату без времени. Это означает, что мы можем получить только текущую дату, но без времени суток:
На этот раз вместо инициализации нового объекта мы вызываем статический метод now() который возвращает текущую дату в соответствии с системными часами с часовым поясом по умолчанию.
Мы можем отформатировать этот объект:
Выполнение этого фрагмента кода даст:
Вы также можете передать ZoneId методу для получения даты на основе указанного часового пояса, а не по умолчанию:
Вы можете получить список всех доступных идентификаторов часовых поясов через:
Местное время
LocalTime является противоположностью LocalDate , поскольку представляет только время без даты. Это означает, что мы можем получить только текущее время дня без фактической даты:
Мы можем легко отформатировать этот объект:
Выполнение этого фрагмента кода даст:
LocalDateTime
И, наконец, LocalDateTime , наиболее часто используемый класс Date / Time в Java, представляет собой комбинацию двух предыдущих — хранит значение как даты, так и времени:
Мы можем легко отформатировать этот объект:
Выполнение этого фрагмента кода даст:
ZonedDateTime
Наряду с предыдущими классами ZonedDateTime также предлагает эту функциональность:
Мы можем легко отформатировать этот объект:
Выполнение этого фрагмента кода даст:
Другой класс, представленный нам в Java 8 Date / Time API, — это класс Clock Он обеспечивает доступ к текущему Instant , LocalDate , LocalTime и LocalDateTime с использованием часового пояса.
При этом, используя Clock , вы практически создаете экземпляры всех из них и можете получить доступ к тем, которые вам интересны.
С помощью этого экземпляра объекта мы можем создать экземпляры многих из ранее упомянутых классов:
Примечание: уместно спросить, почему мы использовали Clock вместо того, чтобы просто оставить метод now() пустым. Clock является обязательным, и метод now() обычно использует системные часы для определения значений. Хотя с помощью часов вы можете иметь больше, чем просто часы вашей системы, если хотите. Однако в нашем примере это не имеет значения.
Используя clock , мы можем извлечь Instant :
Выполнение этого кода даст:
Вы можете создать зонированные Clock , передав ZoneId в Clock.system() :
Печать значения Instant принадлежащего clock , даст:
И, наконец, используя Clock помощью millis() , вы можете получить доступ к миллисекундному значению часов, которое совпадает с System.currentTimeMillis() :
Оба они распечатают:
Джода-Тайм
Joda-Time — это инструмент, который изначально был разработан для решения проблем со старыми классами времени и даты Java.
С выпуском Java 8 эти проблемы были решены, и Joda-Time выполнила свою задачу, хотя сегодня не используется очень часто.
Опять же, если ваш проект не обновлен до Java 8, Joda-Time по-прежнему является отличным инструментом для использования в качестве альтернативы.
Чтобы использовать его в своем проекте, проще всего просто добавить зависимость Maven:
Работа с Joda-Time очень похожа на работу с Java Date / Time API:
Примечание. При первой инициализации DateTime Joda-Time возникают известные проблемы с производительностью из-за загрузки дескрипторов хронологии .
Этот объект легко отформатировать:
Выполнение этого фрагмента кода даст:
Заключение
Во многих случаях кому-то может понадобиться получить текущую дату и / или время в Java, и мы рассмотрели все подходы, которые существуют на данный момент для этого, включая более старые классы — java.util.Date и java.util.Calendar а также новые java.time которые появились с новым API даты / времени.
Кроме того, мы рассмотрели Joda-Time и его подход к получению текущей даты и времени.
Если вы хотите прочитать о преобразовании строки в дату в Java , у нас это есть!
Class Date
Prior to JDK 1.1, the class Date had two additional functions. It allowed the interpretation of dates as year, month, day, hour, minute, and second values. It also allowed the formatting and parsing of date strings. Unfortunately, the API for these functions was not amenable to internationalization. As of JDK 1.1, the Calendar class should be used to convert between dates and time fields and the DateFormat class should be used to format and parse date strings. The corresponding methods in Date are deprecated.
Although the Date class is intended to reflect coordinated universal time (UTC), it may not do so exactly, depending on the host environment of the Java Virtual Machine. Nearly all modern operating systems assume that 1 day = 24 × 60 × 60 = 86400 seconds in all cases. In UTC, however, about once every year or two there is an extra second, called a «leap second.» The leap second is always added as the last second of the day, and always on December 31 or June 30. For example, the last minute of the year 1995 was 61 seconds long, thanks to an added leap second. Most computer clocks are not accurate enough to be able to reflect the leap-second distinction.
Some computer standards are defined in terms of Greenwich mean time (GMT), which is equivalent to universal time (UT). GMT is the «civil» name for the standard; UT is the «scientific» name for the same standard. The distinction between UTC and UT is that UTC is based on an atomic clock and UT is based on astronomical observations, which for all practical purposes is an invisibly fine hair to split. Because the earth’s rotation is not uniform (it slows down and speeds up in complicated ways), UT does not always flow uniformly. Leap seconds are introduced as needed into UTC so as to keep UTC within 0.9 seconds of UT1, which is a version of UT with certain corrections applied. There are other time and date systems as well; for example, the time scale used by the satellite-based global positioning system (GPS) is synchronized to UTC but is not adjusted for leap seconds. An interesting source of further information is the United States Naval Observatory (USNO):
and the material regarding «Systems of Time» at:
which has descriptions of various different time systems including UT, UT1, and UTC.
- A year y is represented by the integer y — 1900 .
- A month is represented by an integer from 0 to 11; 0 is January, 1 is February, and so forth; thus 11 is December.
- A date (day of month) is represented by an integer from 1 to 31 in the usual manner.
- An hour is represented by an integer from 0 to 23. Thus, the hour from midnight to 1 a.m. is hour 0, and the hour from noon to 1 p.m. is hour 12.
- A minute is represented by an integer from 0 to 59 in the usual manner.
- A second is represented by an integer from 0 to 61; the values 60 and 61 occur only for leap seconds and even then only in Java implementations that actually track leap seconds correctly. Because of the manner in which leap seconds are currently introduced, it is extremely unlikely that two leap seconds will occur in the same minute, but this specification follows the date and time conventions for ISO C.
In all cases, arguments given to methods for these purposes need not fall within the indicated ranges; for example, a date may be specified as January 32 and is interpreted as meaning February 1.
How to get the current date and time
I am looking for something that is equivalent to DateTime.Now from C#.
10 Answers 10
Just construct a new Date object without any arguments; this will assign the current date and time to the new object.
Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond.
Make sure you’re using java.util.Date and not java.sql.Date — the latter doesn’t have a zero-arg constructor, and has somewhat different semantics that are the topic of an entirely different conversation. 🙂
The Java Date and Calendar classes are considered by many to be poorly designed. You should take a look at Joda Time, a library commonly used in lieu of Java’s built-in date libraries.
The equivalent of DateTime.Now in Joda Time is:
Update
As noted in the comments, the latest versions of Joda Time have a DateTime.now() method, so:
java.time
The java.util.Date class has been outmoded by the new java.time package (Tutorial) in Java 8 and later. The old java.util.Date/.Calendar classes are notoriously troublesome, confusing, and flawed. Avoid them.
ZonedDateTime
Get the current moment in java.time.
- Date.
- Time-of-day, with a fraction of a second to nanosecond resolution.
- Time zone.
If no time zone is specified, your JVM’s current default time zone is assigned silently. Better to specify your desired/expected time zone than rely implicitly on default.
Generally better to get in the habit of doing your back-end work (business logic, database, storage, data exchange) all in UTC time zone. The code above relies implicitly on the JVM’s current default time zone.
The Instant class represents a moment in the timeline in UTC with a resolution of nanoseconds.
The Instant class is a basic building-block class in java.time and may be used often in your code.
When you need more flexibility in formatting, transform into an OffsetDateTime . Specify a ZoneOffset object. For UTC use the handy constant for UTC.
Time Zone
You easily adjust to another time zone for presentation to the user. Use a proper time zone name, never the 3-4 letter codes such as EST or IST .
Generate a String representation of that date-time value, localized.
Instant
Or, to stay in UTC, use Instant . An Instant object represents a moment on the timeline, to nanosecond resolution, always in UTC. This provides the building block for a zoned date-time, along with a time zone assignment. You can think of it conceptually this way:
You can extract an Instant from a ZonedDateTime .
You can start with an Instant. No need to specify a time zone here, as Instant is always in UTC.
I prefer using the Calendar object.
I find it much easier to work with. You can also get a Date object from the Calendar.
Note that the Date object is mutable and if you want to do anything sophisticated, use jodatime.
java.lang.System.currentTimeMillis(); will return the datetime since the epoch
If you create a new Date object, by default it will be set to the current time:
Java has always got inadequate support for the date and time use cases. For example, the existing classes (such as java.util.Date and SimpleDateFormatter ) aren’t thread-safe which can lead to concurrency issues. Also there are certain flaws in API. For example, years in java.util.Date start at 1900, months start at 1, and days start at 0—not very intuitive. These issues led to popularity of third-party date and time libraries, such as Joda-Time . To address a new date and time API is designed for Java SE 8.
The method now() returns the current date-time using the system clock and default time-zone, not null. It obtains the current date-time from the system clock in the default time-zone. This will query the system clock in the default time-zone to obtain the current date-time. Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.
Как не потеряться во времени — DateTime и Calendar
Привет! Сегодня мы начнем работать с новым типом данных, с которым до этого не сталкивались, а именно — с датами. Что такое дата, думаю, объяснять не нужно:) В принципе, записать текущую дату и время в Java вполне возможно в обычную строку. Но у такого подхода много недостатков. Класс String создан для работы с текстом, и методы у него соответствующие. Если нам нужно будет как-то управлять датой (прибавить к ней 2 часа, например) — String тут не справится. Или, например, — вывести в консоль текущую дату и время на момент компиляции программы. Тут String тоже не поможет: пока ты напишешь код и запустишь его — время изменится и в консоль будет выведено неактуальное. Поэтому в Java его создателями были предусмотрены несколько классов для работы с датами и временем. Первый из них — это класс java.util.Date
Класс Date Java
Мы указали для него полное название, поскольку в другом пакете в Java есть еще класс java.sql.Date . Не перепутай! Первое что нужно о нем знать — он хранит дату в миллисекундах , которые прошли с 1 января 1970 года. Для этой даты есть даже отдельное название — “Unix-время” Довольно интересный способ, согласен? 🙂 Второе, что стоит запомнить: если создать объекта Date с пустым конструктором — результатом будет текущая дата и время на момент создания объекта . Помнишь, мы писали, что для даты в формате String такая задача будет проблематичной? Класс Date ее легко решает. Запусти этот код несколько раз, и увидишь, как время каждый раз будет меняться:) Это возможно именно благодаря хранению в миллисекундах: они являются самой маленькой единицей времени, поэтому результаты настолько точные. Существует и другой конструктор для Date : можно указать точное количество миллисекунд, которое прошло с 00:00 1 января 1970 года до требуемой даты, и она будет создана: Вывод в консоль: У нас получилось 30 мая 2008 года. “Fri” означает день недели — “Friday” (пятница), а MSD — “Moscow Daylight Saving” (московское летнее время). Миллисекунды передаются в формате long , поскольку их количество чаще всего не влезает в int . Итак, какие операции с датами нам могут понадобиться в работе? Ну, самое очевидное, конечно — сравнение . Определить была ли одна дата позже или раньше другой. Это можно сделать по-разному. Например, можно вызвать метод Date.getTime() .Он вернет количество миллисекунд, прошедших с полуночи 1 января 1970 года. Просто вызовем его у двух объектов Date и сравним между собой: Вывод: Но есть и более удобный способ, а именно — использовать специальные методы класса Date : before() , after() и equals() . Все они возвращают результат в формате boolean . Метод before() проверяет, была ли наша дата раньше той, которую мы передаем в качестве аргумента: Вывод в консоль: Похожим образом работает и метод after() , он проверяет была ли ли наша дата позже той, которую мы передаем в качестве аргумента: Вывод в консоль: В наших примерах мы “усыпляем” программу на 2 секунды, чтобы две даты гарантированно отличались. На быстрых компьютерах время между созданием date1 и date2 может быть меньше одной миллисекунды, и в таком случае оба метода — и before() , и after() — будут возвращать false . А вот метод equals() в такой ситуации вернет true ! Ведь он сравнивает именно количество миллисекунд, прошедших с 00:00 1 января 1970 для каждой даты. Объекты будут считаться равными только в том случае, если совпадают вплоть до миллисекунды: Вот еще на что нужно обратить внимание. Если ты откроешь документацию класса Date на сайте Oracle, то увидишь, что многие его методы и конструкторы были обозначены словом Deprecated (“нерекомендуемый‘). Вот, посмотри: Class Date Вот что сами создатели Java говорят про те части классов, которые стали deprecated: “Программный элемент, аннотированный @Deprecated, является тем, что программистам не рекомендуется использовать, как правило, потому, что это опасно, или потому, что существует лучшая альтернатива.” Это не означает, что этими методами вообще нельзя пользоваться. Более того, если ты сам попробуешь запустить код с их использованием в IDEA — он, скорее всего будет работать Возьмем для примера deprecated метод Date.getHours() , который возвращает количество часов из объекта Date . Если на момент запуска кода у вас, например, время 14:21, он выведет число 14. Как видите, deprecated-метод зачеркнут, но он вполне себе работает. Это методы не стали убирать совсем, чтобы не сломать кучу уже написанного с их использованием кода. То есть эти методы не “сломаны” и не “удалены”, просто их не рекомендуют использовать по причине наличия более удобной альтернативы. О ней, кстати, написано прямо в документации: Большинство методов класса Date было перенесено в его улучшенную, расширенную версию — класс Calendar . С ним мы и познакомимся дальше:) alt=»Как не потеряться во времени — DateTime и Calendar — 3″ width=»1024″ />
Java Calendar
- Прибавить к текущей дате месяц или день
- Проверить, является ли год високосным;
- Получить отдельные компоненты даты (например, получить из целой даты номер месяца)
- А также — внутри него разработана очень удобная система констант (многие из них мы увидим ниже).
Перевод строки в Date
- 4 цифры для года (yyyy);
- 2 цифры для месяца (ММ);
- 2 цифры для дня (dd);
- 2 цифры для часов в 24-часовом формате (HH);
- 2 цифры для минут (mm);
- 2 цифры для секунд (ss).
Символ | Описание | Пример |
---|---|---|
G | эра (в английской локализации — AD и BC) | н.э. |
y | год (4-х значное число) | 2020 |
yy | год (последние 2 цифры) | 20 |
yyyy | год (4-х значное число) | 2020 |
M | номер месяца (без лидирующих нулей) | 8 |
MM | номер месяца (с лидирующими нулями, если порядковый номер месяца < 10) | 04 |
MMM | трехбуквенное сокращение месяца (в соответствии с локализацией) | янв |
MMMM | полное название месяца | Июнь |
w | неделя в году (без лидирующих нулей) | 4 |
ww | неделя в году (с лидирующими нулями) | 04 |
W | неделя в месяце (без лидирующих нулей) | 3 |
WW | неделя в месяце (с лидирующим нулем) | 03 |
D | день в году | 67 |
d | день месяца (без лидирующих нулей) | 9 |
dd | день месяца (с лидирующими нулями) | 09 |
F | день недели в месяце (без лидирующих нулей) | 9 |
FF | день недели в месяце (с лидирующими нулями) | 09 |
E | день недели (сокращение) | Вт |
EEEE | день недели (полностью) | пятница |
u | номер дня недели (без лидирующих нулей) | 5 |
uu | номер дня недели (с лидирующими нулями) | 05 |
a | маркер AM/PM | AM |
H | часы в 24-часовом формате без лидирующих нулей | 6 |
HH | часы в 24-часовом формате с лидирующим нулем | 06 |
k | количество часов в 24-часовом формате | 18 |
K | количество часов в 12-часовом формате | 6 |
h | время в 12-часовом формате без лидирующих нулей | 6 |
hh | время в 12-часовом формате с лидирующим нулем | 06 |
m | минуты без лидирующих нулей | 32 |
mm | минуты с лидирующим нулем | 32 |
s | секунды без лидирующих нулей | 11 |
ss | секунды с лидирующим нулем | 11 |
S | миллисекунды | 297 |
z | часовой пояс | EET |
Z | часовой пояс в формате RFC 822 | 300 |
Шаблон | Пример |
---|---|
dd-MM-yyyy | 01-11-2020 |
yyyy-MM-dd | 2019-10-01 |
HH:mm:ss.SSS | 23:59.59.999 |
yyyy-MM-dd HH:mm:ss | 2018-11-30 03:09:02 |
yyyy-MM-dd HH:mm:ss.SSS | 2016-03-01 01:20:47.999 |
yyyy-MM-dd HH:mm:ss.SSS Z | 2013-13-13 23:59:59.999 +0100 |
Создаем строку, с которой нужно задать дату:
Создаем новый объект SimpleDateFormat с шаблоном, который совпадает с тем, что у нас в строке (иначе распарсить не получится):
Как вы видите, у нас тут появился аргумент Locale. Если же мы его опустим, он будет использовать значение Locale по умолчанию, которое не всегда является английским.
Если языковой стандарт не совпадает с входной строкой, то строковые данные, привязанные к языку, как у нас Mon или April, не будут распознаны и вызовут падение — java.text.ParseException, даже в том случае когда шаблон подходит.
Тем не менее, можно не указывать формат, если у нас используется шаблон, который не привязан к языку. Как пример — yyyy-MM-dd HH:mm:ss
Создаём дату с помощью форматтера, который в свою очередь парсит её из входной строки: