Получение «unixtime» в Java


258

Date.getTime () возвращает миллисекунды с 1 января 1970 года. Unixtime - это секунды с 1 января 1970 года. Обычно я не пишу код в java, но я работаю над некоторыми исправлениями ошибок. У меня есть:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Есть ли лучший способ получить unixtime в Java?


27
Поскольку вы приводите его к типу int, вы ввели проблему 2038 года (эквивалент Y2K для Unix). Именно тогда эпоха Unix достигает 2 миллиардов и переходит в минус. Исправление - перейти на 64-битный Unix. Эквивалент Java состоит в том, чтобы оставить это как долго.
Джон М

1
Да, я знаю об этом. Код, с которым он взаимодействует, ожидает 32-битное int для unixtime.
Гари Ричардсон

158
2038 скоро.
Pacerier

Есть правильное имя или стандарт для currentTimeMillis? Я склонен называть это в моей документации миллисекундной версией UNIX.
Том

1
Если вы хотите, чтобы ваша программа переживала переполнение, используйте long, а не int. Нет никакой причины использовать intметку времени, если только вы не используете другую гранулярность, такую ​​как 1 секунда = 4 секунды и т. Д. Либо это, либо скрывайте свой код, чтобы будущие поколения не могли видеть, насколько вы некомпетентны.
Брай

Ответы:


475

Избегайте создания объекта Date с System.currentTimeMillis () . Деление на 1000 возвращает вас к эпохе Unix.

Как упомянуто в комментарии, вы, как правило, хотите, чтобы примитивный long (строчные-l long), а не коробочный объект long (прописные-L Long) для типа переменной unixTime.

long unixTime = System.currentTimeMillis() / 1000L;

3
Также рассмотрите возможность использования примитивного long вместо автобокса на Long, если только вы не хотите обрабатывать число как объект (например, поместить его в коллекцию), снова
избегая

9
Java 32-bit int соответствует 32-битным платформам (и проблема 2038 года). 64-битные платформы используют больший тип данных time_t. Java увернулась от этой пули, используя long как возврат для System.currentTimeMillis (). Если вы преобразуетесь в int, вы вновь вводите проблему 2038 года. См. En.wikipedia.org/wiki/Year_2038_problem#Solutions
Джон М

1
Я думаю, что вы ошибаетесь в одном: нет разницы между строчными буквами «L» и прописными при их использовании в числовых литералах, подобных этому. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
Мэтт Форсайт

5
Обсуждение с заглавными буквами (поясненное выше) касалось типа данных. Примитивный "long" против экземпляра класса "java.lang.Long". Вы говорите о суффиксе буквы на длинном литерале, который, я согласен, может быть прописным или строчным. Хотя нижний регистр "l" выглядит чертовски похоже на цифру "1", поэтому гораздо удобнее читать заглавную букву "L".
Джон М,

1
Нажмите на ссылку на документацию. Возврат определяется как количество миллисекунд с 01.01.1970 в часовом поясе UTC. Вы хотите часовые пояса? Посмотрите на java.util.Calendar.
Джон М

274

В Java 8 добавлен новый API для работы с датами и временем. С Java 8 вы можете использовать

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()возвращает Instant , представляющий текущее системное время. С getEpochSecond()вами вы получите время эпохи (Unix Time) от Instant.


4
В чем разница Instant.now().getEpochSecond(), new Date().getTime()иSystem.currentTimeMillis()
SohamC

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

3
import java.time.Instantесли вы в Скале
akauppi

4
Проверьте этот сайт , а также для подробного описания ... понравилось .. currentTimeMillis
Subroto

1
Обратите внимание, что вы не можете использовать этот метод с более старыми уровнями API для Android.
Али Надализаде
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.