Skip to content

jdk8的时间类

一、新增时间类

localDate、LocalTime、localDateTime这三个类是jdk8新增的三个时间类

方法名|是否静态方法|方法描述

:---😐:---😐:---:

from | 是 | 依据传入的Temporal 对象创建对象实例

now | 是 | 依据系统时钟创建Temporal 对象

of | 是 | 由Temporal 对象的某个部分创建该对象的实例

parse | 是 | 由字符串创建Temporal 对象的实例

atOffset | 否 | 将Temporal 对象和某个时区偏移相结合

atZone | 否 | 将Temporal 对象和某个时区相结合

format | 否 | 使用某个指定的格式器将Temporal 对象转换为字符串(Instant 类不提供该方法)

get | 否 | 读取Temporal 对象的某一部分的值

minus | 否 | 创建Temporal 对象的一个副本,通过将当前Temporal 对象的值减去一定的时长创建该副本

plus | 否 | 创建Temporal 对象的一个副本,通过将当前Temporal 对象的值加上一定的时长创建该副本

with | 否 | 以该Temporal 对象为模板,对某些状态进行修改创建该对象的副本

        //生成一个LocalDate对象
        LocalDate today = LocalDate.of(2020,04,23);
        //用with修改日期并不是修改当前的日期对象,而是生成新的对象
        //修改年
        LocalDate localDate1 = today.withYear(2019);
        //修改月
        LocalDate localDate2 = today.withMonth(03);
        //修改日
        LocalDate localDate3 = today.withDayOfMonth(5);
        //自定义修改,根据传入的类型(枚举ChronoField)去操作
        LocalDate localDate4 = today.with(ChronoField.MONTH_OF_YEAR,8);
        //增加一年
        LocalDate localDate5 = today.plusYears(1);
        //增加一个月
        LocalDate localDate6 = today.plusMonths(1);
        //增加一个星期
        LocalDate localDate7 = today.plusWeeks(1);
        //增加一天
        LocalDate localDate8 = today.plusDays(1);
        //根据自定义增加,根据传入的类型(枚举ChronoUnit)去操作
        LocalDate localDate9 = today.plus(1,ChronoUnit.DAYS);
        //minus与plus相反,减少日期
        //减少一年
        LocalDate localDate10 = today.minusYears(1);

二、对日期类进行复杂的操作

TemporalAdjusters的方法介绍

方法名|方法描述

:---😐:---:

dayOfWeekInMonth | 创建一个新的日期,它的值为同一个月中每一周的第几天

firstDayOfMonth | 创建一个新的日期,它的值为当月的第一天

firstDayOfNextMonth | 创建一个新的日期,它的值为下月的第一天

firstDayOfNextYear | 创建一个新的日期,它的值为明年的第一天

firstDayOfYear | 创建一个新的日期,它的值为当年的第一天

firstInMonth | 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值

lastDayOfMonth | 创建一个新的日期,它的值为当月的最后一天

lastDayOfNextMonth | 创建一个新的日期,它的值为下月的最后一天

lastDayOfNextYear | 创建一个新的日期,它的值为明年的最后一天

lastDayOfYear | 创建一个新的日期,它的值为今年的最后一天

lastInMonth | 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值

next/previous | 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期

nextOrSame/previousOrSame | 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,直接返回该对象

        //初始化一个日期
        LocalDate date = LocalDate.of(2020, 4, 25);
        //获取下个星期的星期天
        LocalDate localDate1 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
        //获取当前月份的第一天
        LocalDate localDate2 = date.with(TemporalAdjusters.firstDayOfMonth());

三、日期格式化转换

日期的格式化必须按照格式化的内容进行格式,比如对LocalDateTime进行格式化,不能只格式日期,必须要格式时间。LocalDate和LocalTime只需要有相应的部分即可。 日期还可以指定时区,在日期对象上指定。

//初始化一个日期
    LocalDate date = LocalDate.of(2020, 4, 25);
    //将日期按照yyyyMMdd的格式输出
    String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
    //将日期按照yyyy-MM-dd的格式输出
    String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
    LocalTime localTime = LocalTime.of(15,10,30);
    //创建一个当前不带毫秒的时间
    LocalTime localTime1 = LocalTime.now().withNano(0)
    LocalDateTime localDateTime = LocalDateTime.of(date,localTime);
    //将日期按照yyyy-MM-ddTHH:mm:ss的格式输出,中间有个T符号
    String s3 = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    //自定义输出格式将日期按照yyyy-MM-dd HH:mm:ss的格式输出
    String s4 = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

//按照自定义的格式化转换日期
    LocalDateTime parse = LocalDateTime.parse("2020-04-23 22:22:22",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

    //时区日期 创建指定的时区标识
           ZoneId romeZone = ZoneId.of("Europe/Rome");
           //获取本地时区
           ZoneId zoneId = TimeZone.getDefault().toZoneId();

           LocalDate date1 = LocalDate.of(2020,4,23);
           //创建指定时区的日期,在日期对象指定时区
           ZonedDateTime zonedDateTime = date1.atStartOfDay(romeZone);

四、Duration和Period

两个类相似和通用的方法介绍

方法名|是否静态方法|方法描述

:---😐:---😐:---:

between |是 |创建两个时间点之间的interval

from |是 |由一个临时时间点创建interval

of |是 |由它的组成部分创建interval 的实例

parse |是 |由字符串创建interval 的实例

addTo |否 |创建该interval 的副本,并将其叠加到某个指定的temporal 对象

get |否 |读取该interval 的状态

isNegative |否 |检查该interval 是否为负值,不包含零

isZero |否 |检查该interval 的时长是否为零

minus |否 |通过减去一定的时间创建该interval 的副本

multipliedBy |否 |将interval 的值乘以某个标量创建该interval 的副本

negated |否 |以忽略某个时长的方式创建该interval 的副本

plus |否 |以增加某个指定的时长的方式创建该interval 的副本

subtractFrom |否 |从指定的temporal 对象中减去该interval

LocalDateTime now = LocalDateTime.now();
System.out.println("计算两个时间的差:");
LocalDateTime end = LocalDateTime.now();
//DAYS表示时间单位
ChronoUnit.DAYS.between(start, end);