Как получить миллисекунды из LocalDateTime в Java 8
мне интересно, есть ли способ получить текущие миллисекунды с 1-1-1970 (эпоха) с помощью нового LocalDate
,LocalTime
или LocalDateTime
классы Java 8.
известный способ ниже:
long currentMilliseconds = new Date().getTime();
или
long currentMilliseconds = System.currentTimeMillis();
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); }
что помогает с тестами, которые подтверждают дату и время неизмеримо.