1.为什么jdk8要引出新日期时间API出现的背景
jdk8前面临的问题:
可变性:像日期和时间这样的类应该是不可变的
偏移性:Date中的年份是从1970年开始的,而月份都是从0开始的
格式化:格式化只对Date有用,Calendar则不行
此外,他们也不是线程安全的;不能处理闰秒等
2.jdk8大部分使用LocalDate、LocalTime、LocalDateTime
下面我们说一下LocalDate、LocalTime、LocalDateTime的使用:
LocalDate相较于LocalTime、LocalDateTime用的更加频繁
三个类的方法的调用:
@Test
public void test1(){
//now() 调用now()方法获取当前日期、时间、日期+时间
System.out.println("*****now() 调用now()方法获取当前日期、时间、日期+时间*****");
LocalDate localDate=LocalDate.now();
LocalTime localTime=LocalTime.now();
LocalDateTime localDateTime=LocalDateTime.now();
out.println(localDate);
out.println(localTime);
out.println(localDateTime);
//of():设置指定的年月日时分秒。没有偏移量
out.println("*****of():设置指定的年月日时分秒。没有偏移量*****");
LocalDateTime localDateTime1=LocalDateTime.of(2022,1,23,17,48,58);
out.println(localDateTime1);
//getXxx() :获取相关属性
out.println("*****getXxx() :获取相关属性******");
out.println(localDateTime.getYear());
out.println(localDateTime.getMonth());
out.println(localDateTime.getDayOfMonth());
out.println(localDateTime.getMonthValue());
out.println(localDateTime.getMinute());
out.println(localDateTime.getDayOfYear());
//体现不可变性
//withXxx():设置相关属性
out.println("******withXxx():设置相关属性******");
LocalDate localDate1=localDate.withDayOfMonth(22);
out.println(localDate);
out.println(localDate1);
LocalDateTime localDateTime2= localDateTime.withHour(4);
out.println(localDateTime);
out.println(localDateTime2);
//plusXxx()加
out.println("******plusXxx()加*****");
LocalDateTime localDateTime3=localDateTime.plusMonths(3);
out.println(localDateTime);
out.println(localDateTime3);
//minusXxx()减
out.println("******minusXxx()减*****");
LocalDateTime localDateTime4=localDateTime.minusMonths(3);
out.println(localDateTime);
out.println(localDateTime4);
}
3.Istant类介绍:
@Test
public void test2(){
//now():获取本初子午线对应的标准时间
Instant instant= Instant.now();
out.println(instant);//2022-01-23T13:09:14.172Z
//添加时间的偏移量
OffsetDateTime offsetDateTime=instant.atOffset(ZoneOffset.ofHours(8));
out.println(offsetDateTime);//2022-01-23T21:09:14.172+08:00
//获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
long milli=instant.toEpochMilli();
System.out.println(milli);//1642943508671
}
4.DateTimeFormatter
* DateTimeFormatter:时间日期的格式化和解析 * 类似于SimpleDateFormat * java.time.format.DateTimeFormatter该类提供了三种格式化方法: * 方式一:预定义标准格式。如:ISO_LOCAL_DATE_TIME,ISO_LOCAL_DATE;ISO_LOCAL * 方式二:自定义格式。如:ofPattern("yyyy-MM-dd hh:mm:ss E") * 方式三:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG);
@Test
public void test3(){
//方式一:预定义标准格式。如:ISO_LOCAL_DATE_TIME,ISO_LOCAL_DATE;ISO_LOCAL
//格式化
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime=LocalDateTime.now();
String format=dateTimeFormatter.format(localDateTime);
System.out.println("方式一:预定义标准格式。如:ISO_LOCAL_DATE_TIME,ISO_LOCAL_DATE;ISO_LOCAL");
System.out.println(localDateTime);//2022-01-23T21:43:07.198
System.out.println(format);//2022-01-23T21:43:07.198 因为时=是预定义标准格式 所以基本都一样
//解析:逆过程 将字符串转化成日期
TemporalAccessor parse = dateTimeFormatter.parse(format);
System.out.println("解析后的结果");
System.out.println(parse);//{},ISO resolved to 2022-01-23T22:07:45.224
//方式二:自定义的格式。如:ofPattern("yyyy-MM-dd hh:mm:ss E")
DateTimeFormatter dateTimeFormatter1=DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss E");
LocalDateTime localDateTime1=LocalDateTime.now();
String format1=dateTimeFormatter1.format(localDateTime1);
System.out.println("方式二:自定义的格式。如:ofPattern(\"yyyy-MM-dd hh:mm:ss E\")");
System.out.println(localDateTime1);//2022-01-23T21:53:28.703
System.out.println(format1);//2022-01-23 09:53:28
//解析
TemporalAccessor parse1 = dateTimeFormatter1.parse(format1);
System.out.println("解析后的结果");
System.out.println(parse1);//{MilliOfSecond=0, SecondOfMinute=49, MinuteOfHour=13, HourOfAmPm=10, MicroOfSecond=0, NanoOfSecond=0},ISO resolved to 2022-01-23
//方式三:本地化相关的格式。如:ofLocalizedDateTime()
//FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT:适用于LocalDateTime
System.out.println("方式三:本地化相关的格式。如:ofLocalizedDateTime()");
DateTimeFormatter dateTimeFormatter2=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
LocalDateTime localDateTime2=LocalDateTime.now();
String format2 = dateTimeFormatter2.format(localDateTime2);
System.out.println(format2);//2022年1月23日 下午10时42分48秒
//解析
TemporalAccessor parse2 = dateTimeFormatter2.parse(format2);
System.out.println(parse2);//{},ISO resolved to 2022-01-23T22:42:48
//FormatStyle.SHORT
DateTimeFormatter dateTimeFormatter3=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
LocalDateTime localDateTime3=LocalDateTime.now();
String format3 = dateTimeFormatter3.format(localDateTime3);
System.out.println(format3);//22-1-23 下午10:42
//解析
TemporalAccessor parse3 = dateTimeFormatter3.parse(format3);
System.out.println(parse3);//{},ISO resolved to 2022-01-23T22:42
//方式二:本地相关的格式 如:ofLocalizedDate()
//FormatStyle.Full/FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT:适用于LocalDate
DateTimeFormatter dateTimeFormatter4=DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate localDate=LocalDate.now();
String format4 = dateTimeFormatter4.format(localDate);
System.out.println(format4);//2022年1月23日 星期日
//解析
TemporalAccessor parse4 = dateTimeFormatter4.parse(format4);
System.out.println(parse4);//{},ISO resolved to 2022-01-23
}