Java8 新特性之 新时间日期 API

LocalDate、LocalTime、LocalDateTime

        LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统的日期、时间、日期和时间。它们提供了简单的日期和或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

        ISO-8601 日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。

    @Test
    public void test1() {
        // 获取当前的时间
        // 当前时间: 2022-02-11T17:42:07.282
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("当前时间: " + localDateTime);


        // 自己指定一个时间 参数依次是 ==> 年月日时分秒
        // 自定义的时间: 2025-02-10T10:42:20
        LocalDateTime dateTime = LocalDateTime.of(2025, 2, 10, 10, 42, 20);
        System.out.println("自定义的时间: " + dateTime);


        // 在 localDateTime1 实例之上加上时间
        LocalDateTime localDateTime1 = localDateTime.plusYears(10)
                .plusMonths(10)
                .plusDays(2)
                .plusWeeks(2)
                .plusHours(50)
                .plusMinutes(200)
                .plusSeconds(30)
                .plusNanos(25);  // 纳秒
        // 当前时间加上一段时间: 2032-12-29T23:02:37.282000025
        System.out.println("当前时间加上一段时间: " + localDateTime1);

        // 在 localDateTime2 实例之上减去时间
        LocalDateTime localDateTime2 = localDateTime1.minusYears(10)
                .minusMonths(10)
                .minusDays(2)
                .minusWeeks(2)
                .minusHours(50)
                .minusMinutes(200)
                .minusSeconds(30)
                .minusNanos(25);

        // 回到当前时间: 2022-02-10T17:42:07.282
        System.out.println("回到当前时间: " + localDateTime2);


        // 获取当前的日期是本年的第多少天
        // 42
        int dayOfYear = localDateTime.getDayOfYear();
        System.out.println(dayOfYear);


        // 获取当前的日期是本月的第多少天
        // 11
        int dayOfMonth = localDateTime.getDayOfMonth();
        System.out.println(dayOfMonth);


        // 获取当天是星期几?
        // FRIDAY
        DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
        System.out.println(dayOfWeek);


        // 获取当前的年份
        int year = localDateTime.getYear();

        // 获取当前的月份, Month 类型的数据
        // 月份的单词: FEBRUARY
        // 月份的数字: 2
        Month month = localDateTime.getMonth();
        System.out.println("月份的单词: " + month);
        System.out.println("月份的数字: " + month.getValue());


        // 获取当前的小时
        int hour = localDateTime.getHour();

        // 获取当前的分钟
        int minute = localDateTime.getMinute();

        // 获取当前的秒
        int second = localDateTime.getSecond();

        // 获取当前的纳秒
        int nano = localDateTime.getNano();

        // 获取当前的月份,数字
        int monthValue = localDateTime.getMonthValue();
        // 2
        System.out.println(monthValue);
    }

Instant: 时间戳(以 Unix 元年: 1970年1月1日00:00:00 到某个时间为止的毫秒数)

    @Test
    public void test2() {
        // 获取当前的世界协调时间 UTC
        Instant inst = Instant.now();
        // 2022-02-11T09:45:06.880Z
        System.out.println(inst);


        // inst 加上一段时间 ==> 东八区时间
        OffsetDateTime offsetDateTime = inst.atOffset(ZoneOffset.ofHours(8));
        // 2022-02-11T17:45:06.880+08:00
        System.out.println(offsetDateTime);


        // 时间戳, 获取 inst 的毫秒值
        // 1644572706880
        System.out.println(inst.toEpochMilli());

        // Unix 元年的时间加上 1000 毫秒
        Instant instant = Instant.ofEpochMilli(1000);
        // 加上 1000 毫秒的值: 1970-01-01T00:00:01Z
        System.out.println("加上 1000 毫秒的值: " + instant);

        // Unix 元年的时间加上 10 秒
        Instant instant1 = Instant.ofEpochSecond(10);
        // 加上 10 秒的值: 1970-01-01T00:00:10Z
        System.out.println("加上 10 秒的值: " + instant1);
    }

时间间隔

Duration: 计算两个时间之间的间隔
Period: 计算两个日期之间的间隔

    @Test
    public void test3() {
        Instant inst1 = Instant.now();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Instant inst2 = Instant.now();

        Duration duration = Duration.between(inst1, inst2);

        // 时间间隔以毫秒的形式输出
        System.out.println(duration.toMillis());

        // 时间间隔以分钟的形式输出
        System.out.println(duration.toMinutes());

        // 时间间隔以纳秒的形式输出
        System.out.println(duration.toNanos());

        // 时间间隔以天的形式输出
        System.out.println(duration.toDays());

        // 时间间隔以小时的形式输出
        System.out.println(duration.toHours());


        System.out.println("-----------两个时间的间隔------------------");

        LocalTime lt1 = LocalTime.now();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LocalTime lt2 = LocalTime.now();

        Duration between = Duration.between(lt1, lt2);
        System.out.println(between.toMillis());

        System.out.println("-----------两个日期的间隔------------------");
        LocalDate ld1 = LocalDate.of(2020, 2, 20);
        LocalDate ld2 = LocalDate.now();
        Period between1 = Period.between(ld1, ld2);


        // 输出两个时间的间隔 P1Y11M22D , 1 年 11 月 22 日
        System.out.println(between1);
        System.out.println(between1.getYears());
        System.out.println(between1.getMonths());
        System.out.println(between1.getDays());
    }
1000
0
1000000000
0
0
-----------两个时间的间隔------------------
1001
-----------两个日期的间隔------------------
P1Y11M22D
1
11
22

日期的操纵

TemporalAdjuster: 时间校正器。有时候可能需要获取例如: 将日期调整到”下个周日“ 等操作。
TemporalAdjusters: 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现

    @Test
    public void test4() {
        // 获取下一个周五的日期
        LocalDate with = LocalDate.now().with(
                TemporalAdjusters.next(DayOfWeek.FRIDAY)
        );
        System.out.println("下一个周五:  " + with);


        // 获取当前日期
        LocalDate now = LocalDate.now();

        // 获取下一个工作日的日期
        LocalDate workDay = now.with((ld) -> {
            LocalDate localDate1 = (LocalDate) ld;
            DayOfWeek dayOfWeek = localDate1.getDayOfWeek();

            switch (dayOfWeek) {
                case FRIDAY:
                    localDate1 = localDate1.plusDays(3);
                    break;

                case SATURDAY:
                    localDate1 = localDate1.plusDays(2);
                    break;

                case SUNDAY:
                    localDate1 = localDate1.plusDays(1);
                    break;
            }
            return localDate1;
        });

        System.out.println("下一个工作日:  " + workDay);
    }
下一个周五:  2022-02-18
下一个工作日:  2022-02-14

DateTimeFormatter: 格式化时间和日期

    @Test
    public void test5() {
        // 日期和时间
        // DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
        // 只要日期
        DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE;
        LocalDateTime now = LocalDateTime.now();

        // 将当前的时间应用到指定的格式上去
        String format = now.format(isoDateTime);
        System.out.println(format);




        // 自定义日期和时间
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日 HH:mm:ss");
        // 将自定义的时间和日期应用到当前的时间上去
        String format1 = now.format(dateTimeFormatter);
        System.out.println(format1);



        // 将转换后的格式还原成 LocalDateTime 的格式: format1 是转换后的字符串,   dateTimeFormatter 是转换规则
        LocalDateTime parse = LocalDateTime.parse(format1, dateTimeFormatter);
        System.out.println(parse);
    }

时区

        Java8 中加入对时区的支持,带时区的时间分别为:

         ZoneDate、ZonedTime、ZonedDateTime

        其中每个时区都对应着地区 ID 都为 “{区域}/{城市}” 的格式 例如: Asia / Shanghai 等

         ZoneId: 该类中包含了所有的时区信息

                 getAvailableZoneIds(): 可以获取所有时区的时区信息
                 of(id): 用指定的时区信息获取 ZoneId 对象

    @Test
    public void test6() {
        // 获取全部的时区
        Set<String> set = ZoneId.getAvailableZoneIds();
        set.forEach(System.out::println);

        // 获取当前牙买加的时间
        ZoneId zoneId = ZoneId.of("Jamaica");
        LocalDateTime ldt = LocalDateTime.now(zoneId);
        System.out.println(ldt);


        // 获取当前上海的时间
        ZoneId zoneId2 = ZoneId.of("Asia/Shanghai");
        LocalDateTime ldt2 = LocalDateTime.now(zoneId2);
        System.out.println(ldt2);


        // 包含 上海与 UTC 时间的时差 的上海时间
        // 2022-02-11T17:12:10.636+08:00[Asia/Shanghai]
        ZonedDateTime zdt = ldt2.atZone(zoneId.of("Asia/Shanghai"));
        System.out.println(zdt);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值