日期和时间是非常复杂的一个东西,因为语言文化和时区等等原因,时间又是一个非常简单的东西,因为他是人类生活的共工基础,所以长时间来形成了非常成熟的API,直接调用感觉不到复杂。
对于一些老程序员来说,已经习惯了老版本的java.util包下Date对象或者Calendar,但是JDK8却重构的时间对象,在java.time包下。
总体来看时间常用场景
- 时间线
- 本地日期
- 本地时间
- 日期调整期
- 时区时间-做日志云和自监控平台常用
- 格式化和解析
- 与遗留老时间日期对象的相互转换(向下兼容)
java.time包下有大量的类,我们应该熟悉,N多类,把时间做了细分,对于时间的表示和运行更加明确
时间线
地球自转--秒--原子钟
Java的Date和TimeAPI规范要求Java使用的时间尺度为:
- 每天86400秒
- 每天正午与官方时间精确度匹配
- 在其他时间点上,以精准定义的方式与官网时间接近匹配
Instant - 表示时间线上的某个点。
新纪元-时间原点-1970年1月1日的物业--英国伦敦格林威治皇家天文台的本初子午线
Instant.MIN~Instant.MAX : 回溯10亿年~公园1 000 000 000 年的12月31日
public static void main(String[] args) throws InterruptedException {
// 格式化 本质要理解一定要有时区的概念,否则没法格式化
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL );
// DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
// .withLocale(Locale.CHINA)
// .withZone(ZoneId.systemDefault());
System.out.println(formatter.format(Instant.now().atZone(ZoneId.systemDefault())));
// 最大时刻
System.out.println("最大时刻:\t" + Instant.MIN);
// 最小时刻
System.out.println("最小时刻:\t" + Instant.MAX);
// 原点时刻
System.out.println("原点时刻:\t" + Instant.EPOCH);
// 当前时刻
System.out.println("当前时刻:\t" + Instant.now());
System.out.println("当前时区时刻:\t" + Instant.now().atZone(ZoneId.systemDefault()));
// 纪元秒
System.out.println("毫秒转换:\t" + Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneId.systemDefault()));
// utc字符串转换
System.out.println("utc字符串:\t" + Instant.parse("2022-10-24T22:31:31.00Z"));
// 获取秒或者纳秒
Instant now = Instant.now();
System.out.println("获取当前时间的纪元秒: \t" + now.getEpochSecond());
System.out.println("获取当前时间的纪元纳秒: \t" + now.getNano());
// 偏移
System.out.println("1分钟后: \t" + now.plusSeconds(60).toString());
// 获取当前时刻
Instant start = Instant.now();
// 做其他事情
Thread.sleep(1000);
// 获取当前时刻
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long seconds = timeElapsed.getSeconds();
System.out.printf("程序运行时间差%d秒", seconds);
}
输出结果:
2022年10月24日 星期一 下午11时00分10秒 CST
最大时刻: -1000000000-01-01T00:00:00Z
最小时刻: +1000000000-12-31T23:59:59.999999999Z
原点时刻: 1970-01-01T00:00:00Z
当前时刻: 2022-10-24T15:00:10.264Z
当前时区时刻: 2022-10-24T23:00:10.264+08:00[Asia/Shanghai]
毫秒转换: 2022-10-24T23:00:10.264+08:00[Asia/Shanghai]
utc字符串: 2022-10-24T22:31:31Z
获取当前时间的纪元秒: 1666623610
获取当前时间的纪元纳秒: 279000000
1分钟后: 2022-10-24T15:01:10.279Z
程序运行时间差1秒
Process finished with exit code 0
- Instant 时刻由秒和纳秒组成final类
- Duration 时间段,两个时间间的时间量final类
- 对于时间可以进行算数运算,instant主要围绕秒级,毫秒级,纳秒级进行偏移,Duration 操作的时间单位更多,并且还可以乘除。