7.日期时间
JDK8新增了3个日期时间类,分别是:LocalDate,LocalTime,LocalDateTime
①LocalDate(日期)
②LocalTime(时间)
③LocalDateTime(日期时间)
日期时间格式化
JDK8之前的日期存在一些问题,比如API过时、线程安全问题、时区处理麻烦等问题。在JDK8中引入了新的日期时间相关的API。
JDK8引入了LocalDate、LocalTime、LocalDateTime类,这些类在java.time
包下,并且它们的实例是不可变对象。分别使用表示ISO-8601日历系统的日期、时间、日期时间。
7.1 日期
日期包含年月日信息,日期的操作的常用API如下
代码演示
@Test public void dateTime01(){ // 获取当前对应的日期 LocalDate now = LocalDate.now(); System.out.println(now); LocalDate date = LocalDate.of(2020, 12, 13); System.out.println(date); // 获取年份 System.out.println(now.getYear()); // 获取月份,英文 System.out.println(now.getMonth()); // 获取月份值 System.out.println( now.getMonthValue()); // 获取当月中的第几天,也就是几号 System.out.println(now.getDayOfMonth()); // 获取当周中的第几天,也就是星期 System.out.println(now.getDayOfWeek()); // 获取年中的第几天 System.out.println(now.getDayOfYear()); // 修改年份为2019 System.out.println(now.withYear(2019)); // 修改月份为2 System.out.println(now.withMonth(2)); // 修改日期为3号 System.out.println(now.withDayOfMonth(3)); }
7.2 时间
时间包含时分秒信息,时间操作常用的API如下
代码演示
@Test public void dateTime02(){ LocalTime time = LocalTime.of(11,12,13); System.out.println(time); // 获取当前时间 LocalTime now = LocalTime.now(); // 获取小时 System.out.println(now.getHour()); // 获取分 System.out.println(now.getMinute()); // 获取秒 System.out.println(now.getSecond()); // 获取纳秒 System.out.println(now.getNano()); // 修改小时为12 System.out.println(now.withHour(12)); // 修改分钟为22 System.out.println(now.withMinute(22)); // 修改秒为33 System.out.println(now.withSecond(33)); }
7.3 日期时间
日期时间包含年月日时分秒信息,常用API如下
代码演示
@Test public void dateTime03(){ LocalDateTime time = LocalDateTime.of(2020,12,11,10,11,12); System.out.println(time); LocalDateTime now = LocalDateTime.now(); System.out.println(now); // 获取年份 System.out.println(now.getYear()); // 获取月份,英文 System.out.println(now.getMonth()); // 获取月份值 System.out.println(now.getMonthValue()); // 获取当月中的第几天,也就是几号 System.out.println(now.getDayOfMonth()); // 获取当周中的第几天,也就是星期 System.out.println(now.getDayOfWeek()); // 获取年中的第几天 System.out.println(now.getDayOfYear()); // 获取小时 System.out.println(now.getHour()); // 获取分 System.out.println(now.getMinute()); // 获取秒 System.out.println(now.getSecond()); // 获取纳秒 System.out.println(now.getNano()); // 修改年份为2019 System.out.println(now.withYear(2019)); // 修改月份为2 System.out.println(now.withMonth(2)); // 修改日期为3号 System.out.println(now.withDayOfMonth(3)); // 修改小时为12 System.out.println(now.withHour(12)); // 修改分钟为22 System.out.println(now.withMinute(22)); // 修改秒为33 System.out.println(now.withSecond(33)); }
tip:
时间跟日期的修改都是返回一个新的日期时间对象,原来的日期时间对象不改变。
7.4 格式化
可以通过java.time.format.DateTimeFormatter
类可以进行日期时间的解析与格式化。
代码演示
@Test public void dateTime04(){ // 日期转成格式化字符串 LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"); String formatNow = now.format(dtf); System.out.println(formatNow); // 格式化字符串转成日期 LocalDateTime parse = LocalDateTime.parse("2021年01月28日 04时14分43秒", dtf); System.out.println(parse); }
7.5 日期时间差
JDK8中通过Duration
用于计算两个“时间”间隔。通过Period
用于计算两个“日期”间隔的类。
Duration代码演示
@Test public void dateTime05(){ LocalTime now = LocalTime.now(); System.out.println(now); LocalTime time = LocalTime.of(17,48,12); System.out.println(time); Duration duration = Duration.between(now,time); // 时间差转成小时 System.out.println(duration.toHours()); // 时间差转成分钟 System.out.println(duration.toMinutes()); // 时间差转成秒 System.out.println(duration.getSeconds()); // 时间差转成纳秒 System.out.println(duration.toNanos()); }
Period代码演示
@Test public void dateTime06(){ LocalDate now = LocalDate.now(); LocalDate date = LocalDate.of(2030,4,30); Period period = Period.between(now,date); // 获取年份差 System.out.println(period.getYears()); // 获取月份差 System.out.println(period.getMonths()); // 获取日期差 System.out.println(period.getDays()); }
注意:
LocalDate now2 = LocalDate.now(); LocalDate localDate = now2.plusMonths(-11);//12是一个周期 Period period = Period.between(now2, localDate); System.out.println(period.getMonths());
7.6 时间校正器
有时候我们需要将日期或者时间进行校正,比如设置为“下个月的第1天”等,可以通过时间校正器进行。
-
TemporalAdjuster:时间校正器。
-
TemporalAdjusters:通过静态方法提供大量的常用的TemporalAdjuster实现。
@Test public void dateTime07(){ LocalDateTime now = LocalDateTime.now(); // 设置下月1号的校正器 TemporalAdjuster firstDayOfNextMonth = temporal -> { LocalDateTime time = (LocalDateTime) temporal; return time.plusMonths(1).withDayOfMonth(1); }; // 通过校正器调节now的值 System.out.println(now.with(firstDayOfNextMonth)); // TemporalAdjusters获取下一年的第1天的校正器 System.out.println(now.with(TemporalAdjusters.firstDayOfNextYear())); }
LocalDateTime的代码
package com.blb.demo4; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; public class Demo1 { public static void main(String[] args) { // LocalDateTime // 创建对象 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.getYear()); System.out.println(localDateTime.getMonthValue());//7 // System.out.println(localDateTime.getMonth());//JULY // System.out.println(localDateTime.getDayOfWeek());//THURSDAY System.out.println(localDateTime.getDayOfMonth());//21 System.out.println(localDateTime.getHour()); System.out.println(localDateTime.getMinute()); System.out.println(localDateTime.getSecond()); // 今年是一年的第多少天 System.out.println(localDateTime.getDayOfYear());//202 // 星期几 System.out.println(localDateTime.getDayOfWeek().getValue());//4 // 创建一个指定日期的时间 2022-1-1 00:00:00 LocalDateTime localDateTime2 = localDateTime.of(2022, 1, 1, 0, 0,0); System.out.println(localDateTime2); System.out.println(localDateTime); //创建日期时间格式化工具类,并指定格式 // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); // System.out.println(formatter.format(localDateTime)); // 2022年07月21日 11时13分06秒 // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"); // System.out.println(formatter.format(localDateTime)); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("星期e");//星期五 第一天是从星期天开始 System.out.println(formatter.format(localDateTime)); // 如何将字符串转为LocalDateTime 2022-07-21 11:15:00 DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); TemporalAccessor parse = formatter1.parse("2022-07-21 11:15:00"); LocalDateTime localDateTime3 = LocalDateTime.from(parse); System.out.println(localDateTime3); } }
一般都是写静态的,就可以直接通过类名去调用了,就不用创建对象,公共的地方用静态的,非公共的用实例的。有没有返回值,一般return的有返回值的还需要再使用的就用有返回值,如果这个返回值不需要用了就可以不用返回值直接sout。