Instant
计算机存储的当前时间,本质上只是一个不断递增的整数。Java提供System.currentTimeMillis()
返回的就是以毫秒标识当前时间戳。
这个当前时间戳在java.time中以Instant类型表示,我们用Instant.now()获取当前时间戳,效果和System.currentTimeMillis()
类似:
Instant now = Instant.now();
System.out.println(now.getEpochSecond()); // 秒
System.out.println(now.toEpochMilli()); // 毫秒
实际上,Instant
内部只有两个核心字段:
public final class Instant implements ... {
private final long seconds;
private final int nanos;
}
一个是以秒为单位的时间戳,一个是更精确的纳秒精度。它和System.currentTimeMillis()
返回的long
相比,只是多了更高精度的纳秒。
既然Instant
就是时间戳,那么,给它附加上一个时区,就可以创建出ZonedDateTime
:
// 以指定时间戳创建Instant:
Instant ins = Instant.ofEpochSecond(1568568760);
ZonedDateTime zdt = ins.atZone(ZoneId.systemDefault());
System.out.println(zdt); // 2019-09-16T01:32:40+08:00[Asia/Shanghai]
可见,对于某一个时间戳,给它关联上指定的ZoneId
,就得到了ZonedDateTime
,继而可以获得了对应时区的LocalDateTime
。
所以,LocalDateTime
,ZoneId
,Instant
,ZonedDateTime
和long
都可以互相转换:
最后更新于
这有帮助吗?