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