it-swarm.com.ru

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

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

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

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

или же

long currentMilliseconds = System.currentTimeMillis();
214
George Siggouroglou

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

Если вы хотите узнать количество миллисекунд, прошедших с начала эпохи , , тогда используйте System.currentTimeMillis() в качестве анубианский нуб указал . Если это так, то нет никаких причин использовать какой-либо из новых 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();
268
Stuart Marks

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

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()

68
brian

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

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

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

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

17
Dani

Поскольку Java 8, вы можете вызвать Java.time.Instant.toEpochMilli().

Например, звонок

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

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

final long currentTimeJava1 = System.currentTimeMillis();
10
Marteng

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

7
Anubian Noob

Вы можете использовать Java.sql.Timestamp также для получения миллисекунд.

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

Спасибо!

5
Nalam

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

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

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

и тогда в ваших тестах вы можете легко смоделировать это:

@MockBean private Clock clock;

или у вас может быть другой боб:

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

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

2
JeeBee