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