logo

Получение Unix-времени в Java: эффективные методы

Быстрый ответ

Для быстрого получения текущего значения Unix-времени в секундах в Java применяется следующий метод:

Java
Скопировать код
long unixTime = System.currentTimeMillis() / 1000L; // преобразуем миллисекунды в секунды

Такой подход мгновенно дает Unix-время, преобразуя системное время из миллисекунд в секунды.

Работа с Unix-временем в Java: оптимальные подходы

Программирование Java неизбежно влечет за собой работу с Unix-временем, или временем эпохи. В этом разделе рассмотрим различные методы обработки Unix-времени в Java – от классических до современных.

Использование java.time начиная с Java 8+

Если вам более подходят современные методики работы со временем в Java, начиная с версии 8 и выше, стоит использовать возможности JSR 310:

Java
Скопировать код
long unixTime = Instant.now().getEpochSecond(); // Java берет на себя все вычисления

Этот метод даст вам Unix-время в секундах без дополнительных усилий.

Тестируете свой код? Применяйте Clock или InstantSource

Для написания тестов удобно использовать класс Clock:

Java
Скопировать код
Clock clockForTest = Clock.fixed(Instant.now(), ZoneOffset.UTC);
long unixTime = Instant.now(clockForTest).getEpochSecond(); // фиксируем время для тестов

С появлением Java 17 процесс работы с временем в тестах ощутимо упрощается благодаря InstantSource:

Java
Скопировать код
InstantSource testingSource = InstantSource.fixed(Instant.now()); // более удобный способ ничего не представить
long unixTime = testingSource.instant().getEpochSecond();

Теперь тестирование кода, зависящего от времени, становится простым и надежным.

Чистая конвертация с использованием TimeUnit

Если вы работаете с миллисекундами и хотите преобразовать их в секунды, предпочтительнее использование TimeUnit, а не ручные преобразования:

Java
Скопировать код
long unixTime = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); // пусть `TimeUnit` выполняет всю работу

Почему в '1000L' используется строчная 'l'

В константе 1000L используется строчная 'l' для улучшения читаемости и предотвращения путаницы между '1' и 'l'.

Визуализация

В некоторых случаях одного изображения достаточно для лучшего понимания кода. Давайте рассмотрим визуализацию:

Запускаем:

Java
Скопировать код
long unixTime = System.currentTimeMillis() / 1000L; // и наша Java-машина времени отправляет нас в путешествие...

И Java-программа уловила момент времени с начала Unix-эпохи (1970 – настоящее время) и вернула его в формате Unix-секунд, словно этакий:

[📏: ...1970...1980...1990...2000...2010...2020...📍(Unix-секунды)...]

Здесь 📍 отмечает точный, универсальный момент во времени.

Для версий до Java 8

Если вы используете Java 6 или 7, вы все равно можете воспользоваться функционалом java.time через библиотеку ThreeTen Backport. Ведь не всем дано жить на грани настоящего, верно?

Совместимость с Android

Разрабатываете под Android или на старых платформах? Вы можете использовать API java.time на более старых версиях благодаря desugaring, которое позволяет писать новейший код и на старых платформах.

Что стоит почитать?

Углубить свое понимание работы с датой и временем в Java поможет руководство от Oracle.

Полезные материалы

  1. Java SE 8 Date and Time – Не забудьте ознакомиться со всеми возможностями, которые предоставляет JSR 310.
  2. Получение "unixtime" в Java – Stack Overflow – Здесь можно найти множество интересных обсуждений на тему Unix-времени.
  3. System (Java Platform SE 8 ) – Информация о методе System.currentTimeMillis().
  4. Instant (Java Platform SE 8 ) – На этой странице вы найдите все, что нужно знать о классе Instant.
  5. Epoch Converter – Unix Timestamp Converter – Этот конвертер Unix-эпохи поможет вам понять и перевести время.
  6. Только мгновенье... – Лучшие практики современного программирования времени в Java.
  7. Только мгновенье... – Лаконичное объяснение работы с Unix Timestamp в Java.