新日期时间API出现的背景
如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的;不能处理闰秒等。
- 第三次引入的API是成功的,并且Java8中引入的java.time API已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。
- Java8吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的 java.time中包含了所有关于==本地日期(LocalDate)== 、==本地时间(LocalTime)==、==本地日期时间(LocalDateTime)==、==时区(ZonedDateTime)==和==持续时间(Duration)==的类。历史悠久的 Date 类新增了tolnstant()方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期API大大简化了日期时间和本地化的管理。
public void testDate1(){
//偏移量 jdk8之前Date中的年份是从1900开始的,而月份都从0开始
Date date1=new Date(2020-1900,9-1,8); //Tue Sep 08 00:00:00 CST 2020
System.out.println(date1);
Date date=new Date(); //Sat Dec 12 18:55:30 CST 2020 2020/12/12
System.out.println(date);
}
JDK8新API
主要的类
- LocalTime:表示一个时间,而不是日期。
- LocalDate:代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期
- LocalDateTime:是用来表示日期和时间的,这是一个最常用的类之一。
- 引进原因
- 偏移性:年份从1900开始,月份从0开始
- 可变性:日期时间应该是不变的
/**
* LocalDate,LocalTime,LocalDateTime的使用
* 不可变性
* 说明:
* 1.LocalDateTime相较于LocalDate,LocalTime使用频率要高
* 2.类似于Calendar
*/
@Test
public void testDate2(){
LocalDate localDate= LocalDate.now(); //2020-12-12 当前日期
LocalTime localTime= LocalTime.now(); //18:57:01.202 当前日期
LocalDateTime now = LocalDateTime.now(); //2020-12-12T18:57:01.202 获取当前日期,时间,时间日期
//of():设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime of = LocalDateTime.of(2020, 11, 30, 10, 27, 5);
System.out.println(of);//2020-11-30T10:27:05
//getXXXX():获取相关属性
System.out.println(localDate.getDayOfMonth());//getDayOfMonth 这个月第多少天
System.out.println(localDate.getDayOfYear()); //getDayOfYear 这一年第多少天
//体现不可变性 ***返回值改变,原有的不变***
//withXXXX():设置相关的属性
LocalDate localDate1 = localDate.withDayOfMonth(29);
System.out.println(localDate);//2020-12-12
System.out.println(localDate1);//2020-12-29
// plus :加操作
LocalDateTime plusMonths = now.plusMonths(3);
System.out.println(plusMonths);
// minus:减多少天
LocalDateTime minusDays = now.minusDays(5);
System.out.println(minusDays);
}

Instant类
class test{
/**
* Instant的使用
* 类似于java.util.Date类
*/
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();//2020-12-12T11:07:28.174Z
//添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//2020-12-12T19:07:28.174+08:00
//获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
long l = instant.toEpochMilli();//1607771248174
Instant instant1 = Instant.ofEpochMilli(l);//2020-12-12T11:07:28.174Z 根据毫秒数获取Instant
}

DateTimeFormatter
class test{
/**
* DateTimeFormatter:格式化或解析日期、时间
* 类似于SimpleDateFormat
*/
@Test
public void test4(){
//方式一:预定义的标准格式:如ISO_LOCAL_DATE_TIME,ISO_LOCAL_DATE,....
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;//2020-12-12T19:09:22.831
//格式化:日期--》字符串
LocalDateTime localDatetime = LocalDateTime.now();
String str = formatter.format(localDatetime);//2020-12-12T19:09:22.831
//解析:字符串--》日期
TemporalAccessor parse = formatter.parse("2020-11-30T10:53:34.63");
System.out.println(parse);//{},ISO resolved to 2020-11-30T10:53:34.630
//方式二:
//本地化相关的格式:如ofLocalizedDateTime()
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
String str1 = dateTimeFormatter.format(LocalDate.now());//2020年12月12日
//方式三:
//自定义的格式:ofPattern("yyyy=MM-dd hh:mm:ss")
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String format = pattern.format(LocalDate.now());//2020-12-12
TemporalAccessor parse1 = pattern.parse(format);//{},ISO resolved to 2020-12-12
}
}