概述
Java 8中新增了新的日期处理包java.time,解决了jdk 1.7之前日期类Calendar,DateFormat线程不安全的问题,为了熟悉API特地学习了一下,写此博客作为记录,并分享给大家。
详细使用方法请参考下面的代码:
package top.jacktgq.demo2;import java.sql.Timestamp;import java.time.DayOfWeek;import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.Month;import java.time.MonthDay;import java.time.Period;import java.time.Year;import java.time.YearMonth;import java.time.ZoneId;import java.time.ZonedDateTime;import java.time.format.DateTimeFormatter;import java.time.format.FormatStyle;import java.time.temporal.ChronoField;import java.time.temporal.ChronoUnit;import java.time.temporal.Temporal;import java.time.temporal.TemporalAccessor;import java.time.temporal.TemporalAdjuster;import java.time.temporal.TemporalAdjusters;import java.time.temporal.TemporalQuery;import java.util.Calendar;import java.util.Date;import java.util.Set;import java.util.TimeZone;import org.junit.Test;/**
*
* @Title: Java8TimeClassesMethodTest.java
* @Package top.jacktgq.demo2
* @Description: Date-Time API中的所有类均生成不可变实例,他们是线程安全的,并且这些类不提供公共构造函数,
* 也就是说没办法通过new的方式直接创建,需要采用工厂方法加以实例化。
* @author CandyWall
* @date 2020年5月13日 下午3:08:37
* @version V1.0
*/publicclassJava8TimeClassesMethodTest{@Test/**
* now()方法入门
*/publicvoiddemo1(){//使用now方法创建Instant类的实例对象
Instant instantNow= Instant.now();//使用now方法创建LocalDate类的实例对象
LocalDate localDateNow= LocalDate.now();//使用now方法创建LocalTime类的实例对象
LocalTime localTimeNow= LocalTime.now();//使用now方法创建LocalDateTime类的实例对象
LocalDateTime localDateTime= LocalDateTime.now();//将实例对象都打印到控制台查看内容
System.out.println("Instant"+"\t:"+ instantNow);
System.out.println("LocalDate"+"\t:"+ localDateNow);
System.out.println("LocalTime"+"\t:"+ localTimeNow);
System.out.println("LocalDateTime"+"\t:"+ localDateTime);}@Test/**
* 使用now()方法创建Year、YearMonth、MonthDay类的实例
*/publicvoiddemo2(){//使用now()方法创建Year类的实例
Year year= Year.now();//使用now()YearMonth类的实例
YearMonth yearMonth= YearMonth.now();//使用now()MonthDay类的实例
MonthDay monthDay= MonthDay.now();
System.out.println("Year:"+"\t:"+ year);
System.out.println("YearMonth:"+"\t:"+ yearMonth);
System.out.println("MonthDay:"+"\t:"+ monthDay);}@Test/**
* of()方法
*/publicvoiddemo3(){//初始化2020年5月13日的LocalDate对象
LocalDate localDate= LocalDate.of(2020,5,13);
System.out.println("LocalDate:"+"\t:"+ localDate);//初始化下午3:30分30秒的LocalTime对象 -> 如果是晚上的时间,需要加12.//LocalTime.of()方法的重载形式有以下几种,可以根据实际情况自行使用。//LocalTime.of(int hour, int minute) -> 根据小时/分钟生成对象。//LocalTime.of(int hour, int minute, int second) -> 根据小时/分钟/秒生成对象//LocalTime.of(int hour, int minute, int second, int nanoOfSecond) -> 根据小时/分钟/秒/毫秒/纳生成对象//注意:如果秒和纳秒都是0的话,那么默认不会封装这些数据,只显示小时和分钟
LocalTime localTime= LocalTime.of(15,30,30,90);
System.out.println("LocalTime:"+"\t:"+ localTime);//初始化2020年5月13日 下午3:30分30秒的LocalDateTime对象//LocalDateTime.of()方法的重载形式有以下几种,可以根据实际情况自行使用//LocalDateTime.of(int year, int month, int dayofMonth, int hour, int minute) -> 根据 年/月/日/时/分 生成对象//LocalDateTime.of(int year, int month, int dayofMonth, int hour, int minute, int second, int nanoOfSecond) -> 根据 年/月/日/时/分/秒/纳秒 生成对象
LocalDateTime localDateTime= LocalDateTime.of(2020,5,13,15,30,30,90);
System.out.println("LocalDateTime:"+"\t:"+ localDateTime);//LocalDateTime的of()方法的特殊用法://LocalDateTime.of(LocalDate localDate, LocalTime localTime)
System.out.println("LocalDateTime的of()方法的特殊用法:"+ LocalDateTime.of(localDate, localTime));}@Test/**
* 时区相关
*/publicvoiddemo4(){//获取所有的时区信息
Set<String> availableZoneIds= ZoneId.getAvailableZoneIds();for(String zoneId: availableZoneIds){
System.out.println(zoneId);}//获取当前系统默认的时区信息 -> 中国
System.out.println("系统默认时区:"+ ZoneId.systemDefault());}@Test/**
* 为LocalDateTime添加时区信息
*/publicvoiddemo5(){//1、封装LocalDateTime对象,参数自定义 -> 2020年5月14日 15点00分38秒
LocalDateTime localDateTime= LocalDateTime.of(2020,5,14,15,0,38);//2、LocalDateTime对象现在只是封装了一个时间,并没有时区相关的数据,所以需要添加时区信息到对象中,使用atZone()方法
ZonedDateTime zonedDateTime= localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println("Asia/Shanghai对应的当前时间是:"+ zonedDateTime);//3、更改时区查看其它时区的当前时间,通过withZoneSameInstant()方法即可更改
ZonedDateTime tokyoZonedDateTime= zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
System.out.println("Asia/Tokyo对应的当前时间是:"+ tokyoZonedDateTime);}@Testpublicvoiddemo6(){//在初始化LocalDate和LocalDateTime的时候,月份的参数建议传入枚举类//2020年5月14日15点12分36秒
LocalDateTime localDateTime= LocalDateTime.of(2020, Month.MAY,15,12,36);
System.out.println(localDateTime);//Month枚举类 -> of()方法可以根据传入的数字返回对应的枚举
Month month= Month.of(12);
System.out.println(month);}@Test/**
* 创建当前时间(不带时区)
* 创建当前时间(只包含年月日)
* 创建当前时间(包含年月日时分秒并且带有时区)
* 创建2012年12月31日7时38分46秒的日期对象 月份使用枚举表示
* 创建7时38分46秒的时间对象
*/publicvoidtest01(){//1、创建当前时间(不带时区)
LocalTime localTime1= LocalTime.now();
System.out.println("LocalTime:\t"+ localTime1);//2、创建当前时间(只包含年月日)
LocalDate localDate= LocalDate.now();
System.out.println("LocalDate:\t"+ localDate);//3、创建当前时间(包含年月日时分秒并且带有时区)
ZonedDateTime zonedDateTime= ZonedDateTime.now();
System.out.println("ZonedDateTime:\t"+ zonedDateTime);//4、创建2012年12月31日7时38分46秒的日期对象 月份使用枚举表示
LocalDateTime localDateTime= LocalDateTime.of(2012, Month.DECEMBER,31,7,38,46);
System.out.println("LocalDateTime:\t"+ localDateTime);//5、创建7时38分46秒的时间对象
LocalTime localTime2= LocalTime.of(7,38,46);
System.out.println("localTime2:\t"+ localTime2);}@Test/**
* 日期的计算
*/publicvoiddemo7(){//封装LocalDate对象
LocalDate localDate= LocalDate.now();
System.out.println("当前日期是:"+ localDate);//计算当前日期的4天后的日期
System.out.println("当前日期的4天后的日期是:"+ localDate.plusDays(4));//计算当前日期3周后的日期
System.out.println("计算当前日期3周后的日期是:"+ localDate.plusWeeks(3));//计算当前日期5个月后的日期
System.out.println("计算当前日期5个月后的日期是:"+ localDate.plusMonths(5));//计算当前日期2年后的日期
System.out.println("计算当前日期2年后的日期是:"+ localDate.plusYears(2));//如果需要计算当前日期之前的日期只需要调用LocalDate.minus()方法即可}@Testpublicvoiddemo8(){//封装LocalTime对象
LocalTime localTime= LocalTime.now();
System.out.println("当前时间是:"+ localTime);//计算当前时间的500纳秒后的时间
System.out.println("当前时间的500纳秒后的时间是:"+ localTime.plusNanos(500));//计算当前时间的45秒后的时间
System.out.println("当前时间的45秒后的时间是:"+ localTime.plusSeconds(45));//计算当前时间的19分钟后的时间
System.out.println("当前时间的19分钟后的时间是:"+ localTime.plusMinutes(19));//计算当前时间的3小时后的时间
System.out.println("当前时间的3小时后的时间是:"+ localTime.plusHours(3));//如果需要计算当前时间之前的时间只需要调用LocalDate.minus()方法即可}@Testpublicvoiddemo9(){//需求:今天程序员小张查看自己的车辆保险记录的时候看到了还有2年3月8天就到期了,计算到期的日期是什么时候
LocalDate localDate= LocalDate.now();//写法一:
System.out.println("当前日期是:"+ localDate+",保险到期的日期是:"+ localDate.plusYears(2).plusMonths(3).plusDays(8));//写法二:
System.out.println("当前日期是:"+ localDate+",保险到期的日期是:"+ localDate.plus(Period.of(2,3,8)));}@Testpublicvoiddemo10(){//结婚10年称为锡婚,2020年2月2日11时11分11秒称为对称日,//很多情侣准备在那天结婚,如果在那天结婚了,那么锡婚会发生在什么时候?
LocalDateTime marryTime= LocalDateTime.of(2020, Month.FEBRUARY,2,11,11,11);
LocalDateTime tin_marriageTime= marryTime.plus(1, ChronoUnit.DECADES);
System.out.println("如果在 "+ marryTime+" 的时候结婚,那么锡婚发生的时间点在:"+ tin_marriageTime);
System.out.println("如果锡婚后的半天需要请所有的亲戚朋友们吃饭,那么吃饭的时间节点是:"+ tin_marriageTime.plus(1, ChronoUnit.HALF_DAYS));}@Testpublicvoiddemo11(){//修改日期或者时间中的某个值
LocalDateTime localDateTime= LocalDateTime.now();
System.out.println("当前时间是:"+ localDateTime);//将日期修改成1号//写法一:
System.out.println("将当前日期修改成2019年1月1日14时08分26秒:"+ localDateTime.withYear(2019).withMonth(1).withDayOfMonth(1).withHour(14).withMinute(8).withSecond(26));//写法二:
System.out.println("将当前日期修改成2019年1月1日14时08分26秒:"+ localDateTime.with(ChronoField.YEAR,2019).with(ChronoField.MONTH_OF_YEAR,1).with(ChronoField.DAY_OF_MONTH,1).with(ChronoField.HOUR_OF_DAY,14).with(ChronoField.MINUTE_OF_HOUR,8).with(ChronoField.SECOND_OF_MINUTE,26));}@Testpublicvoidtest02(){//使用三种方式计算2019年7月19日14时38分34秒后的3年7个月18天后是什么时候
LocalDateTime localDateTime= LocalDateTime.of(2019,7,19,14,38,34);//方式一:
System.out.println("2019年7月19日14时38分34秒后的3年7个月18天后是:"+
localDateTime.plusYears(3).plusMonths(7).plusDays(18));//方式二:
System.out.println("2019年7月19日14时38分34秒后的3年7个月18天后是:"+
localDateTime.plus(Period.of(3,7,18)));//方式三:
System.out.println("2019年7月19日14时38分34秒后的3年7个月18天后是:"+
localDateTime.plus(3, ChronoUnit.YEARS).plus(7, ChronoUnit.MONTHS).plus(18, ChronoUnit.DAYS));}@Testpublicvoiddemo12(){//封装日期为当前时间
LocalDateTime now= LocalDateTime.now();
System.out.println("当前时间为:"+ now);//通过with()方法传入TemporalAdjuster类的实现类对象,就可以进行更改,//实现类对象室友TemporalAdjuster类的静态方法来提供的//修改时间为当月第一天
System.out.println("将时间修改为当月的第一天,具体时间为:"+ now.with(TemporalAdjusters.firstDayOfMonth()));//修改时间为下个月的第一天
System.out.println("将时间修改为下个月的第一天,具体时间为:"+ now.with(TemporalAdjusters.firstDayOfNextMonth()));//修改时间为下一年的第一天
System.out.println("将时间修改为下一年的第一天,具体时间为:"+ now.with(TemporalAdjusters.firstDayOfNextYear()));//修改时间为本年的第一天
System.out.println("将时间修改为本年的第一天,具体时间为:"+ now.with(TemporalAdjusters.firstDayOfYear()));//修改时间为本月的最后一天
System.out.println("将时间修改为本月的最后一天,具体时间为:"+ now.with(TemporalAdjusters.lastDayOfMonth()));//修改时间为本年的最后一天
System.out.println("将时间修改为本年的最后一天,具体时间为:"+ now.with(TemporalAdjusters.lastDayOfYear()));//总结:TemporalAdjuster是一个接口,with方法实际上传入的是这个接口的实现类对象,//TemporalAdjusters并不是TemporalAdjuster的实现类,//只不过TemporalAdjusters的静态方法实现了TempopralAdjuster,并且将实现类对象返回了。}@Testpublicvoiddemo13(){//封装日期对象为当前日期
LocalDate now= LocalDate.now();//将当前日期修改为下个周日
System.out.println("下一个周日是:"+ now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));//将当前日期修改为上一个周日
System.out.println("上一个周日是:"+ now.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)));}@Testpublicvoiddemo14(){//假如员工一个月中领取工资,发薪日是每个月的15号,如果发薪日是周末,则调整为周五
LocalDate payDate= LocalDate.of(2018,12,15);
LocalDate realPayDate= LocalDate.from(newTemporalAdjuster(){@Overridepublic TemporaladjustInto(Temporal temporal){//1、Temporal是日期时间对象的父接口,实际上可以理解为传入的就是LocalDate或者LocalTime对象