Получение Unix-времени в Java: эффективные методы
Быстрый ответ
Для быстрого получения текущего значения Unix-времени в секундах в Java применяется следующий метод:
long unixTime = System.currentTimeMillis() / 1000L; // преобразуем миллисекунды в секунды
Такой подход мгновенно дает Unix-время, преобразуя системное время из миллисекунд в секунды.
Работа с Unix-временем в Java: оптимальные подходы
Программирование Java неизбежно влечет за собой работу с Unix-временем, или временем эпохи. В этом разделе рассмотрим различные методы обработки Unix-времени в Java – от классических до современных.
Использование java.time
начиная с Java 8+
Если вам более подходят современные методики работы со временем в Java, начиная с версии 8 и выше, стоит использовать возможности JSR 310:
long unixTime = Instant.now().getEpochSecond(); // Java берет на себя все вычисления
Этот метод даст вам Unix-время в секундах без дополнительных усилий.
Тестируете свой код? Применяйте Clock
или InstantSource
Для написания тестов удобно использовать класс Clock
:
Clock clockForTest = Clock.fixed(Instant.now(), ZoneOffset.UTC);
long unixTime = Instant.now(clockForTest).getEpochSecond(); // фиксируем время для тестов
С появлением Java 17 процесс работы с временем в тестах ощутимо упрощается благодаря InstantSource
:
InstantSource testingSource = InstantSource.fixed(Instant.now()); // более удобный способ ничего не представить
long unixTime = testingSource.instant().getEpochSecond();
Теперь тестирование кода, зависящего от времени, становится простым и надежным.
Чистая конвертация с использованием TimeUnit
Если вы работаете с миллисекундами и хотите преобразовать их в секунды, предпочтительнее использование TimeUnit
, а не ручные преобразования:
long unixTime = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); // пусть `TimeUnit` выполняет всю работу
Почему в '1000L' используется строчная 'l'
В константе 1000L
используется строчная 'l' для улучшения читаемости и предотвращения путаницы между '1' и 'l'.
Визуализация
В некоторых случаях одного изображения достаточно для лучшего понимания кода. Давайте рассмотрим визуализацию:
Запускаем:
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.
Полезные материалы
- Java SE 8 Date and Time – Не забудьте ознакомиться со всеми возможностями, которые предоставляет JSR 310.
- Получение "unixtime" в Java – Stack Overflow – Здесь можно найти множество интересных обсуждений на тему Unix-времени.
- System (Java Platform SE 8 ) – Информация о методе
System.currentTimeMillis()
. - Instant (Java Platform SE 8 ) – На этой странице вы найдите все, что нужно знать о классе
Instant
. - Epoch Converter – Unix Timestamp Converter – Этот конвертер Unix-эпохи поможет вам понять и перевести время.
- Только мгновенье... – Лучшие практики современного программирования времени в Java.
- Только мгновенье... – Лаконичное объяснение работы с Unix Timestamp в Java.