Мне интересно , если есть способ , чтобы получить текущие миллисекунды , так как 1-1-1970 (эпохи) , используя новый LocalDate
, LocalTime
или LocalDateTime
классы Java 8.
Известный способ ниже:
long currentMilliseconds = new Date().getTime();
или
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
оно не имеет значения в этом контексте. Подумайте Календарь + Настенные часы с действительно хорошей точностью, и не беспокойтесь о часовых поясах и местности. Так что нет способа вернуться к «UTC Time» из LocalTimeОтветы:
Я не совсем уверен, что вы имеете в виду под «текущими миллисекундами», но я предполагаю, что это число миллисекунд со времени «эпохи», а именно полуночи, 1 января 1970 года по Гринвичу.
Если вы хотите узнать количество миллисекунд с начала эпохи , то используйте,
System.currentTimeMillis()
как указал Анубиан Нуб . Если это так, то нет никаких причин использовать какой-либо из новых API java.time для этого.Однако, может быть, у вас уже есть
LocalDateTime
или похожий объект откуда-то, и вы хотите преобразовать его в миллисекунды с той эпохи. Это невозможно сделать напрямую, посколькуLocalDateTime
семейство объектов не имеет представления о том, в каком часовом поясе они находятся. Таким образом, необходимо предоставить информацию о часовом поясе, чтобы найти время относительно эпохи, которая находится в UTC.Предположим, у вас есть
LocalDateTime
такие:Вам необходимо применить информацию о часовом поясе, давая
ZonedDateTime
. Я в том же часовом поясе, что и Лос-Анджелес, поэтому я бы сделал что-то вроде этого:Конечно, это делает предположения о часовом поясе. И есть крайние случаи, которые могут произойти, например, если местное время называется временем около перехода на летнее время (летнее время). Давайте отложим это, но вы должны знать, что такие случаи существуют.
В любом случае, если вы можете получить действительное значение
ZonedDateTime
, вы можете преобразовать его в количество миллисекунд с начала эпохи, например так:источник
getEpochSecond
метод ( с помощью ChronoZonedDateTime по умолчанию ). Нет необходимости вInstant
.ZonedDateTime
такжеInstant
сgetNano
методом, так что вы не сможете просто заменитьinst
сzdt
в вашем примере?Что я делаю, поэтому я не указываю часовой пояс,
дает
Как видите, цифры одинаковы, за исключением небольшого времени выполнения.
На всякий случай, если вам не нравится System.currentTimeMillis, используйте
Instant.now().toEpochMilli()
источник
Чтобы избежать ZoneId, вы можете сделать:
Получив 0 в качестве значения, это правильно!
источник
ZoneOffset.ofTotalSeconds(0)
это же какZoneOffset.UTC
ZoneOffset
, это подклассZoneId
, поэтому я бы точно не сказал, что вы этого избежали, но пока вы счастливы ...ZoneId
?С Java 8 можно звонить
java.time.Instant.toEpochMilli()
.Например, звонок
дает те же результаты, что и
источник
Вы также можете использовать,
java.sql.Timestamp
чтобы получить миллисекунды.источник
Timestamp
класс давно устарел и полон проблем с дизайном, поэтому я бы предпочел этого избегать, особенно когда мы можем использовать классы изjava.time
лайковLocalDateTime
.Timestamp
, Можете поделиться какой-нибудь статьей об этом? Это также помогает мне избежать использованияTimestamp
моего кода. Спасибо!Date
но часто не может быть обработан какDate
. Большинство методов, унаследованных отDate
одного конструктора, устарели. В егоtoString
методе используется часовой пояс JVM, что смущает многих, поскольку одно и то жеTimestamp
печатается по-разному на разных компьютерах ( пример ).LocalDate.of(year, month, day)
Чтобы узнать текущее время в миллисекундах (начиная с эпохи), используйте
System.currentTimeMillis()
.источник
Если у вас есть часы Java 8, то вы можете их использовать
clock.millis()
(хотя и рекомендуется использоватьclock.instant()
Java 8 Instant, так как это более точно).Почему вы используете часы Java 8? Таким образом, в вашей структуре DI вы можете создать bean-компонент Clock:
и тогда в ваших тестах вы можете легко смоделировать это:
или у вас может быть другой боб:
который помогает с тестами, которые утверждают даты и время неизмеримо.
источник
источник
Почему никто не упомянул метод
LocalDateTime.toEpochSecond()
:Это кажется короче, чем многие предложенные ответы выше ...
источник
toEpochMilli
метода, учитывая тот факт, что вы можете указать даже наносекунды в LocalDateTime: есть методLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.