Как получить миллисекунды из 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();
}