Java 8新增Java.time包下常用的日期类LocalDate、LocalTime、LocalDateTime、DateFormatter详解

2022年11月19日12:56:25

概述

  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对象
  • 作者:糖果墙
  • 原文链接:https://blog.csdn.net/qq_38505969/article/details/106129129
    更新时间:2022年11月19日12:56:25 ,共 9248 字。