4、新时间日期 API

1、简介

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

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

2、LocalDate、 LocalTime、 LocalDateTime常用方法:

方法 描述 示例
now() 静态方法,根据当前时间创建对象 LocalDateTime localDateTime = LocalDateTime.now();
of() 静态方法,根据指定日期/时间创建对象 LocalDateTime localDateTime = LocalDateTime.of(2018, 10,26, 12, 10, 55);
plusDays, plusWeeks,plusMonths, plusYears 向当前 LocalDate 对象添加几天、几周、 几个月、 几年
minusDays, minusWeeks,minusMonths, minusYears 从当前 LocalDate 对象减去几天、几周、 几个月、 几年
plus, minus 添加或减少一个 Duration 或 Period
withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天数、 年份天数、 月份、 年份 修 改 为 指 定 的 值 并 返 回 新 的LocalDate 对象
getDayOfMonth 获得月份天数(1-31)
getDayOfYear 获得年份天数(1-366)
getDayOfWeek 获得星期几(返回一个 DayOfWeek枚举值)
getMonth 获得月份, 返回一个 Month 枚举值
getMonthValue 获得月份(1-12)
getYear 获得年份
until 获得两个日期之间的 Period 对象,或者指定 ChronoUnits 的数字
isBefore, isAfter 比较两个 LocalDate
isLeapYear 判断是否是闰年

3、使用和示例

1. LocalDate、LocalTime、LocalDateTime
2. Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
3. Duration 和 Period

  • Duration:用于计算两个“时间”间隔
  • Period:用于计算两个“日期”间隔

4. 日期的操纵

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

5. DateTimeFormatter : 解析和格式化日期或时间
6. 时区的处理

  • ZoneId:该类中包含了所有的时区信息
    getAvailableZoneIds() : 可以获取所有时区时区信息。
    of(id) : 用指定的时区信息获取 ZoneId 对象。
  • ZonedDate、 ZonedTime、 ZonedDateTime
    其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式。
    例如 : Asia/Shanghai 等

示例:

    /**
     * 1、LocalDate、LocalTime、LocalDateTime
     */
    @Test
    public void test01(){
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        LocalDateTime ldt2 = LocalDateTime.of(2018, 12, 22, 10, 10, 10);
        System.out.println(ldt2);
//      加二十年
        LocalDateTime ldt3 = ldt2.plusYears(20);
        System.out.println(ldt3);
//      减两个月
        LocalDateTime ldt4 = ldt2.minusMonths(2);
        System.out.println(ldt4);
    }

输出结果:

2019-01-05T10:35:31.597
2018-12-22T10:10:10
2038-12-22T10:10:10
2018-10-22T10:10:10

    /**
     * 2、Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
     */
    @Test
    public void test02(){
        Instant ins = Instant.now();
        System.out.println(ins); //默认使用 UTC 时区
        OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); // 转成中国时区
        System.out.println(odt);

        System.out.println(ins.toEpochMilli()); // 毫秒时间戳
    }

输出结果:

2019-01-05T02:43:22.004Z
2019-01-05T10:43:22.004+08:00
1546656202004

    /**
     * 3、Duration : 用于计算两个“时间”间隔
     *    Period : 用于计算两个“日期”间隔
     */
    @Test
    public void test3(){
        Instant ins1 = Instant.now();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        Instant ins2 = Instant.now();
        System.out.println("所耗费时间为:" + Duration.between(ins1, ins2));

        System.out.println("----------------------------------");

        LocalDate ld1 = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2011, 1, 1);

        Period pe = Period.between(ld2, ld1);
        System.out.println(pe.getYears());
        System.out.println(pe.getMonths());
        System.out.println(pe.getDays());
    }

输出结果:

所耗费时间为:PT1.001S
----------------------------------
8
0
4

    /**
     * 4、TemporalAdjuster : 时间校正器
     */
    @Test
    public void test04(){
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
        System.out.println(ldt2);

        //自定义:下一个工作日
        LocalDateTime ldt4 = ldt.with((l) -> {
            LocalDateTime ldt3 = (LocalDateTime) l;
            DayOfWeek dow = ldt3.getDayOfWeek();

            if(dow.equals(DayOfWeek.FRIDAY)){
                return ldt3.plusDays(3);
            }else if(dow.equals(DayOfWeek.SATURDAY)){
                return ldt3.plusDays(2);
            }else{
                return ldt3.plusDays(1);
            }
        });
        System.out.println(ldt4);
    }

输出结果:

2019-01-05T11:14:23.353
2019-01-11T11:14:23.353
2019-01-07T11:14:23.353

    /**
     * 5、DateTimeFormatter : 解析和格式化日期或时间
     */
    @Test
    public void test05(){
        DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");

        LocalDateTime ldt = LocalDateTime.now();
        String strDate = ldt.format(dft);
        System.out.println(strDate);

        LocalDateTime newLdt = parse(strDate, dft);
        System.out.println(newLdt);
    }

输出结果:

2019年01月05日 11:29:06 星期六
2019-01-05T11:29:06

    /**
     * 6、ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期
     */
    @Test
    public void test06(){
        Set<String> set = ZoneId.getAvailableZoneIds(); // 获取所有时区
//        set.forEach(System.out::println);

        LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(ldt);

        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
        System.out.println(zdt);
    }

输出结果:

2019-01-05T11:35:52.179
2019-01-04T19:35:52.181-08:00[US/Pacific]

你可能感兴趣的:(jdk新特性)