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);