Как получить миллисекунды из LocalDateTime в Java 8
Мне интересно, есть ли способ получить текущие миллисекунды с 1-1-1970 (эпоха), используя новые классы LocalDate
, LocalTime
или LocalDateTime
Java 8.
Известный путь ниже:
long currentMilliseconds = new Date().getTime();
или
long currentMilliseconds = System.currentTimeMillis();
Ответы
Ответ 1
Я не совсем уверен, что вы подразумеваете под "текущими миллисекундами", но я буду считать, что это число миллисекунд с момента "эпохи", а именно полуночи, 1 января 1970 г. UTC.
Если вы хотите найти количество миллисекунд с эпохи прямо сейчас, используйте System.currentTimeMillis()
как Анубский Noob указал. Если это так, нет оснований для использования каких-либо новых API java.time для этого.
Однако, возможно, у вас уже есть объект LocalDateTime
или похожий объект, и вы хотите преобразовать его в миллисекунды с эпохи. Это невозможно сделать напрямую, поскольку семейство объектов LocalDateTime
не имеет представления о том, в каком часовом поясе они находятся. Таким образом, информация о часовом поясе должна быть предоставлена для поиска времени относительно эпохи, которая находится в UTC.
Предположим, что у вас есть LocalDateTime
:
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
Вам необходимо указать информацию о часовом поясе, указав ZonedDateTime
. Я в том же часовом поясе, что и Лос-Анджелес, поэтому я бы сделал что-то вроде этого:
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));
Конечно, это делает предположения о часовом поясе. И есть краевые случаи, которые могут возникнуть, например, если местное время происходит, чтобы назвать время, приближающееся к переходному периоду перехода на летнее время (летнее время). Отложите их в сторону, но вы должны знать, что эти случаи существуют.
В любом случае, если вы можете получить действительный ZonedDateTime
, вы можете преобразовать его в число миллисекунд с эпохи, например:
long millis = zdt.toInstant().toEpochMilli();
Ответ 2
Что я делаю, я не указываю часовой пояс,
System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());
дает
ldt 1424812121078
ctm 1424812121281
На всякий случай вам не нравится System.current...., используйте Instant.now().toEpochMilli()
Ответ 3
Чтобы избежать ZoneId, вы можете:
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);
System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());
Получение 0 в качестве значения, это правильно!
Ответ 4
Начиная с Java 8 вы можете вызывать java.time.Instant.toEpochMilli()
.
Например, звонок
final long currentTimeJava8 = Instant.now().toEpochMilli();
дает те же результаты, что и
final long currentTimeJava1 = System.currentTimeMillis();
Ответ 5
Чтобы получить текущее время в миллисекундах (с эпохи), используйте System.currentTimeMillis()
.
Ответ 6
Вы также можете использовать java.sql.Timestamp
, чтобы получить миллисекунды.
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
Ответ 7
Если у вас есть Java 8 Clock, то вы можете использовать clock.millis()
(хотя он рекомендует использовать clock.instant()
чтобы получить Java 8 Instant, поскольку это более точно).
Почему вы используете часы Java 8? Таким образом, в вашей DI-структуре вы можете создать компонент bean:
@Bean
public Clock getClock() {
return Clock.systemUTC();
}
и тогда в ваших тестах вы можете легко смоделировать это:
@MockBean private Clock clock;
или у вас может быть другой боб:
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
который помогает с тестами, которые утверждают даты и время неизмеримо.
Ответ 8
default LocalDateTime getDateFromLong(long timestamp) {
try {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
} catch (DateTimeException tdException) {
// throw new
}
}
default Long getLongFromDateTime(LocalDateTime dateTime) {
return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}