Получение "unixtime" в Java
Date.getTime() возвращает миллисекунды с 1 января 1970 года. Unixtime - это секунды с 1 января 1970 года. Обычно я не пишу код в java, но я работаю над некоторыми исправлениями ошибок. Я имею:
Date now = new Date();
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();
Есть ли лучший способ получить unixtime в Java?
ОБНОВИТЬ
Основываясь на предложении Джона М., я получил:
return (int) (System.currentTimeMillis() / 1000L);
3 ответа
Избегайте создания объекта Date с System.currentTimeMillis (). Деление на 1000 возвращает вас к эпохе Unix.
Как упомянуто в комментарии, вы обычно хотите, чтобы примитивный long (строчные-l long), а не штучный объект long (прописные-L Long) для типа переменной unixTime.
long unixTime = System.currentTimeMillis() / 1000L;
В Java 8 добавлен новый API для работы с датами и временем. С Java 8 вы можете использовать
import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();
Instant.now()
возвращает момент, который представляет текущее системное время. С getEpochSecond()
Вы получаете секунды эпохи (время Unix) от Instant
,
Уже есть два отличных ответа. По поводу нового дубликата я погружаюсь немного глубже в двух направлениях:
- Что делать на джаве 7?
- Как написать тестируемую версию?
Для Явы 7
Если вы все еще используете Java 7, вы все равно можете выбрать, какой из других ответов вы хотите использовать. Миша упоминает, что java.time был представлен в Java 8. Но java.time также был портирован на Java 6 и 7 в Backport ThreeTen . Получение бэкпорта может показаться излишним для получения временной метки Unix, но если вы выполняете какую-либо дополнительную работу с датами и временем в своей программе, я все же думаю, что вам следует подумать об этом. Внизу есть ссылка.
Также деление на 1000 в вашем собственном коде может показаться очень незначительным. Тем не менее, я взял за привычку оставлять как можно больше работы с датами и временем стандартной библиотеке, предпочтительно java.time. Есть так много других ситуаций, когда преобразование кажется простым, но легко ошибиться. Поэтому я не хочу делать их в своем коде. Итак, мое чистое решение для Java 7 (без внешней библиотеки/бэкпорта), вероятно, будет выглядеть так:
long unixTime = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
System.out.println(unixTime);
1636883947
Теперь я также рассказываю читателю, почему я делю на 1000. Хотя код немного длиннее, он также более понятен.
Более тестируемый
java.time также предлагает тестируемое решение для Java 7 и 8 и более поздних версий. Мы можем внедрить источник текущего времени.
Clock clock = Clock.systemUTC();
long unixTime = Instant.now(clock).getEpochSecond();
System.out.println(unixTime);
Вывод только что:
1636882578
(Я запустил это на Java 1.7.0_67, используя ThreeTen Backport 1.3.6.)
В тесте, где вам нужно контролировать, какое время используется для воспроизводимого результата, например, получить часы с фиксированным временем:
Clock clock = Clock.fixed(Instant.ofEpochSecond(1_635_936_963), ZoneOffset.UTC);
Теперь вывод кода — это время, которое мы указали:
1635936963
Если все, что вам нужно, это
Instant
s, так как Java 17 больше не использует
Clock
. Использовать
InstantSource
.
InstantSource instantSource
= InstantSource.fixed(Instant.ofEpochSecond(1_654_321_098));
long unixTime = instantSource.instant().getEpochSecond();
1654321098
Ссылки
- Дублирующийся вопрос , как получить текущее значение Long timestamp в java, например 1635936963 [дубликат] , спрашивая о Java 7.
- Учебное пособие по Oracle: Date Time , объясняющее, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где впервые был описан.
- Проект ThreeTen Backport ,
бэкпорт
java.time
для Java 6 и 7 (ThreeTen для JSR-310). - API-интерфейсы Java 8+ доступны через дешугаринг
- Вопрос Как проверить дату, созданную с помощью LocalDateTime.now()