Instant
2023-02-18 15:31:12 时间
我们已经讲过,计算机存储的当前时间,本质上只是一个不断递增的整数。Java提供的System.currentTimeMillis()
返回的就是以毫秒表示的当前时间戳。
这个当前时间戳在java.time
中以Instant
类型表示,我们用Instant.now()
获取当前时间戳,效果和System.currentTimeMillis()
类似:
import java.time.*;
----
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println(now.getEpochSecond()); // 秒
System.out.println(now.toEpochMilli()); // 毫秒
}
}
打印的结果类似:
1568568760
1568568760316
实际上,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
都可以互相转换:
┌─────────────┐
│LocalDateTime│────┐
└─────────────┘ │ ┌─────────────┐
├───>│ZonedDateTime│
┌─────────────┐ │ └─────────────┘
│ ZoneId │────┘ ▲
└─────────────┘ ┌─────────┴─────────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Instant │<───>│ long │
└─────────────┘ └─────────────┘
转换的时候,只需要留意long
类型以毫秒还是秒为单位即可。
小结
Instant
表示高精度时间戳,它可以和ZonedDateTime
以及long
互相转换。
相关文章
- 删错了文件怎么办,文件快速恢复
- ChatGPT 浏览器插件实现思路解析
- 存储系统中的算法:LSM 树设计原理
- 说透游戏中常用的两种随机算法
- 我用消息队列做了一款联机小游戏
- 用算法打败算法
- CRUD 一年多,我的破局思路
- 如何学习开源项目,我又总结了套路
- Union Find 并查集算法原理及应用
- Visual Studio 2022软件下载和安装教程
- 佛萨奇2.0开发系统逻辑源码
- Visual Studio 2019软件下载和安装教程
- Visual Studio 2017软件下载和安装教程
- Visual Studio 2015软件下载和安装教程
- Visual Studio 2013软件下载和安装教程
- 什么是微服务?
- Shell编程从看懂到看开①(Shell概述、变量、运算符、条件判断)
- Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)
- Shell编程从看懂到看开③(函数、echo、printf、test)
- [SpringBoot系列]任务与邮件