我想知道是否有一种方法可以使用Java 8的新的LocalDate, LocalTime或LocalDateTime类来获取自1-1-1970 (epoch)以来的当前毫秒。
已知的方法如下:
long currentMilliseconds = new Date().getTime();
or
long currentMilliseconds = System.currentTimeMillis();
我想知道是否有一种方法可以使用Java 8的新的LocalDate, LocalTime或LocalDateTime类来获取自1-1-1970 (epoch)以来的当前毫秒。
已知的方法如下:
long currentMilliseconds = new Date().getTime();
or
long currentMilliseconds = System.currentTimeMillis();
当前回答
我认为这个更简单:
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
Assert.assertEquals(System.currentTimeMillis(), zdt.toInstant().toEpochMilli());
获取类似System.currentTimeMillis()(从UTC)的millis。
其他回答
从Java 8开始,你可以调用Java .time. instant . toepochmilli()。
例如,调用
final long currentTimeJava8 = Instant.now().toEpochMilli();
得到的结果和
final long currentTimeJava1 = System.currentTimeMillis();
我认为这个更简单:
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
Assert.assertEquals(System.currentTimeMillis(), zdt.toInstant().toEpochMilli());
获取类似System.currentTimeMillis()(从UTC)的millis。
这里有一些没有人提到的方法。但我看不出有什么理由它们不应该起作用。
对于LocalDate,可以使用toEpochDay()方法。它返回自01/01/1970以来的天数。这个数字可以很容易地转换为毫秒:
long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());
文档可以在这里找到。
对于LocalDateTime,可以使用toEpochSecond()方法。它返回自01/01/1970以来的秒数。这个数字也可以转换为毫秒:
long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());
这里有相关的文档。
如果你有一个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:
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
这有助于不可测量地断言日期和时间的测试。
日期和时间为字符串到长(毫秒):
String dateTimeString = "2020-12-12T14:34:18.000Z";
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
LocalDateTime localDateTime = LocalDateTime
.parse(dateTimeString, formatter);
Long dateTimeMillis = localDateTime
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();