我想知道是否有办法使用Java 8的新LocalDate
,LocalTime
或LocalDateTime
类来获得自1-1-1970(epoch)以来的当前毫秒数。< / p>
以下是已知的方式:
long currentMilliseconds = new Date().getTime();
或
long currentMilliseconds = System.currentTimeMillis();
答案 0 :(得分:265)
我不完全确定你的“当前毫秒”是什么意思,但我会假设它是自“世纪”以来的毫秒数,即UTC时间1970年1月1日午夜。
如果您想立即找到自纪元以来的毫秒数,请使用System.currentTimeMillis()
作为Anubian Noob has pointed out。如果是这样,就没有理由使用任何新的java.time API来执行此操作。
但是,也许您已经从某处获得了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();
答案 1 :(得分:68)
我做了什么,所以我没有指定时区,
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()
答案 2 :(得分:17)
要避免使用ZoneId,您可以执行以下操作:
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);
System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());
将0作为值,这是正确的!
答案 3 :(得分:10)
从Java 8开始,您可以调用java.time.Instant.toEpochMilli()
。
例如电话
final long currentTimeJava8 = Instant.now().toEpochMilli();
为您提供与
相同的结果final long currentTimeJava1 = System.currentTimeMillis();
答案 4 :(得分:7)
要以毫秒(自纪元以来)获取当前时间,请使用System.currentTimeMillis()
。
答案 5 :(得分:4)
您还可以使用java.sql.Timestamp
来获取毫秒数。
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
谢谢!
答案 6 :(得分:2)
如果您有Java 8 Clock,则可以使用clock.millis()
(尽管它建议您使用clock.instant()
来获取Java 8 Instant,因为它更准确)。
您为什么要使用Java 8时钟?因此,在您的DI框架中,您可以创建一个Clock Bean:
@Bean
public Clock getClock() {
return Clock.systemUTC();
}
,然后在测试中可以轻松模拟它:
@MockBean private Clock clock;
或者您可以使用其他bean:
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
这有助于对日期和时间进行不可估量的测试。
答案 7 :(得分:0)
default LocalDateTime getDateFromLong(long timestamp) {
try {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
} catch (DateTimeException tdException) {
// throw new
}
}
default Long getLongFromDateTime(LocalDateTime dateTime) {
return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}
答案 8 :(得分:0)
为什么没有人提到方法LocalDateTime.toEpochSecond()
:
LocalDateTime localDateTime = ... // whatever e.g. LocalDateTime.now()
long time2epoch = localDateTime.toEpochSecond(ZoneOffset.UTC);
这似乎比上面的许多建议答案要短...
答案 9 :(得分:0)
您可以尝试以下方法:
long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
答案 10 :(得分:0)
日期和时间作为字符串到长(毫秒):
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();
答案 11 :(得分:0)
对于 LocalDateTime 我这样做:
LocalDateTime.of(2021,3,18,7,17,24,341000000)
.toInstant(OffsetDateTime.now().getOffset())
.toEpochMilli()