JDK8-日期和时间API

日期和时间是非常复杂的一个东西,因为语言文化和时区等等原因,时间又是一个非常简单的东西,因为他是人类生活的共工基础,所以长时间来形成了非常成熟的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 操作的时间单位更多,并且还可以乘除。
posted @ 2022-10-24 23:32  红尘过客2022  阅读(90)  评论(0编辑  收藏  举报