Как получить миллисекунды из LocalDateTime в Java 8


мне интересно, есть ли способ получить текущие миллисекунды с 1-1-1970 (эпоха) с помощью нового LocalDate,LocalTime или LocalDateTime классы Java 8.

известный способ ниже:

long currentMilliseconds = new Date().getTime();

или

long currentMilliseconds = System.currentTimeMillis();
7 168

7 ответов:

Я не совсем уверен, что вы подразумеваете под "текущими миллисекундами", но я предполагаю, что это число миллисекунд с момента "эпохи", а именно полночь, 1 января 1970 UTC.

если вы хотите найти количество миллисекунд с начала эпохи сейчас, затем использовать System.currentTimeMillis() как Нуб Anubian указал. Если это так, нет никаких причин использовать любую из новых java.время для этого есть.

однако, может быть, у вас уже есть LocalDateTime или подобный объект откуда-то и вы хотите преобразовать его в миллисекундах с начала эпохи. Это невозможно сделать напрямую, так как LocalDateTime семейство объектов не имеет понятия, в каком часовом поясе они находятся. Таким образом, сведений о часовом поясе должна быть предоставлена, чтобы найти время относительно эпохи, которая находится в пгт.

Предположим, у вас есть 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();

что я делаю, поэтому я не указываю часовой пояс,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

дает

ldt 1424812121078 
ctm 1424812121281

на всякий случай, если вам не нравится система.текущий.... используйте Instant.now().toEpochMilli()

чтобы избежать ZoneId вы можете сделать:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

получать 0 в качестве значения, это верно!

начиная с Java 8 вы можете использовать

final long currentTimeJava8 = Instant.now().toEpochMilli();

что дает вам те же результаты, что и

final long currentTimeJava1 = System.currentTimeMillis();

чтобы получить текущее время в миллисекундах (начиная с эпохи), используйте System.currentTimeMillis().

можно использовать java.sql.Timestamp также, чтобы получить миллисекунд.

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);

спасибо!

если у вас есть часы Java 8, то вы можете использовать clock.millis() (хотя он рекомендует вам использовать clock.instant() чтобы получить Java 8 Instant, так как это более точно).

почему вы используете часы Java 8? Таким образом, в вашей структуре DI вы можете создать Боб часов:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

и тогда в ваших тестах вы можете легко издеваться над ним:

@MockBean private Clock clock;

или вы можете иметь различные драже:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

что помогает с тестами, которые подтверждают дату и время неизмеримо.