Получение "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,

Уже есть два отличных ответа. По поводу нового дубликата я погружаюсь немного глубже в двух направлениях:

  1. Что делать на джаве 7?
  2. Как написать тестируемую версию?

Для Явы 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

Если все, что вам нужно, это Instants, так как Java 17 больше не использует Clock. Использовать InstantSource.

          InstantSource instantSource 
            = InstantSource.fixed(Instant.ofEpochSecond(1_654_321_098));
    long unixTime = instantSource.instant().getEpochSecond();

1654321098

Ссылки

Другие вопросы по тегам