Jdk8新日期时间API

264 阅读4分钟

新日期时间API出现的背景

如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

  1. 可变性:像日期和时间这样的类应该是不可变的。
  2. 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  3. 格式化:格式化只对Date有用,Calendar则不行。
  4. 此外,它们也不是线程安全的;不能处理闰秒等。
  • 第三次引入的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
}
}