Java 8新特性之-- Date-Time API(LocalDate/Time/DateTime 日期时间API)

一、概要

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  • 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

  • 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

  • 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  • Local(本地) − 简化了日期时间的处理,没有时区的问题。

  • Zoned(时区) − 通过制定的时区处理日期时间。

新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

  • Instant——它代表的是时间戳
  • LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
  • LocalTime——它代表的是不含日期的时间
  • LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
  • ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

二、LocalDate

2.1创建LocalDate的方式有很多种,这里介绍几种最常用的方式:

  • LocalDate now = LocalDate.now(); // 无参当前时间  // 输出2019-01-15
  • LocalDate of = LocalDate.of(2019, 1, 15); // 分别传递 年 月 日创建   // 输出2019-01-15
  • LocalDate parse = LocalDate.parse("2019-01-15"); // 传递日期字符串  // 输出2019-01-15
  • LocalDate parse1 = LocalDate.parse("2019/01/15", DateTimeFormatter.ofPattern("yyyy/MM/dd")); // 按指定格式创建日期  // 输出2019-01-15

2.2LocalDate常用方法总结

  • getYear()    int    获取当前日期的年份
  • getMonth()    Month    获取当前日期的月份对象
  • getMonthValue()    int    获取当前日期是第几月
  • getDayOfWeek()    DayOfWeek    表示该对象表示的日期是星期几
  • getDayOfMonth()    int    表示该对象表示的日期是这个月第几天
  • getDayOfYear()    int    表示该对象表示的日期是今年第几天
  • withYear(int year)    LocalDate    修改当前对象的年份
  • withMonth(int month)    LocalDate    修改当前对象的月份
  • withDayOfMonth(intdayOfMonth)    LocalDate   修改当前对象在当月的日期
  • isLeapYear()    boolean    是否是闰年
  • lengthOfMonth()    int    这个月有多少天
  • lengthOfYear()    int    该对象表示的年份有多少天(365或者366)
  • plusYears(longyearsToAdd)    LocalDate   当前对象增加指定的年份数
  • plusMonths(longmonthsToAdd)    LocalDate   当前对象增加指定的月份数
  • plusWeeks(longweeksToAdd)    LocalDate   当前对象增加指定的周数
  • plusDays(longdaysToAdd)    LocalDate   当前对象增加指定的天数
  • minusYears(longyearsToSubtract)    LocalDate    当前对象减去指定的年数
  • minusMonths(longmonthsToSubtract)    LocalDate    当前对象减去注定的月数
  • minusWeeks(longweeksToSubtract)    LocalDate    当前对象减去指定的周数
  • minusDays(longdaysToSubtract)    LocalDate    当前对象减去指定的天数
  • compareTo(ChronoLocalDateother)    int    比较当前对象和other对象在时间上的大小,返回值如果为正,则当前对象时间较晚,
  • isBefore(ChronoLocalDateother)    boolean   比较当前对象日期是否在other对象日期之前
  • isAfter(ChronoLocalDateother)    boolean   比较当前对象日期是否在other对象日期之后
  • isEqual(ChronoLocalDateother)    boolean   比较两个日期对象是否相等
  • atTime(LocalTime time)  LocalDateTime  转换成  LocalDateTime

2.3  通用的 增加 日期的方法

  plus(long amountToAdd, TemporalUnit unit)  LocalDate  按照后面给定字段添加指定数量的日期

LocalDate now = LocalDate.now(); // 2019-01-15
LocalDate plusDate = now.plus(4, ChronoUnit.YEARS);  //添加数量4 添加字段 年 
System.out.println(plusDate);
// 2023-01-15

2.4将日期转成字符串

   format (DateTimeFormatter formatter)   String     传递一个格式化器

LocalDate now = LocalDate.parse("2019/01/15", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
String plusDate = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(plusDate);
// 2019年01月15日

2.5 计算日期的间隔 

  until(Temporal endExclusive, TemporalUnit unit)  long  传一个日期对象 和 间隔类型

public static void main(String[] args) {
    LocalDate now = LocalDate.now(); // 2019-01-15
    LocalDate of = LocalDate.of(1989, 07, 02);
    long until = now.until(of, ChronoUnit.MONTHS);  // 间隔 月
    System.out.println(until);
    // -354
}

三、LocalDate 和 Date的相互转换

3.1LocaLDate -> Date 的过程是LocaLDate -> ZonedDateTime -> Instant -> Date

public static void main(String[] args) {
    LocalDate now = LocalDate.now();
    ZonedDateTime zdt = now.atStartOfDay(ZoneId.systemDefault());
    Instant instant = zdt.toInstant();
    Date from = Date.from(instant);
}

3.2 Date -> LocalDate  的过程是和上面相反 Date -> Instant -> ZoneDateTime -> LocalDate

public static void main(String[] args) {
    Date date = new Date();
    Instant instant = date.toInstant();
    ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
    LocalDate localDate = zdt.toLocalDate();
}

四、LocalTime

4.1创建LocalTime的方式有很多种,这里介绍几种最常用的方式:

  • LocalTime now = LocalTime.now();  //输出15:30:05.723
  • LocalTime of = LocalTime.of(15, 30, 05);//输出15:30:05
  • LocalTime parse = LocalTime.parse("15:30:05");//输出15:30:05
  • LocalTime parse1 = LocalTime.parse("15时30分05", DateTimeFormatter.ofPattern("HH时mm分ss"));//输出15:30:05

4.2 LocalTime常用方与LocatDate的同名方法作用相同,只是区分出LocatTime仅仅是操作时间的就行。

4.3 LocalTime 转 LocalDateTime 

LocalDateTime atDate  (LocalDate  date)  // 传递一个LocalDate可转成LocalDateTIme

五、LocalDateTime

5.1创建LocalDateTIme的方式有很多种,这里介绍几种最常用的方式:

  • LocalDateTime now = LocalDateTime.now(); // 输出  2019-01-15T15:48:00.822
  • LocalDateTime of = LocalDateTime.of(2019, 1, 05, 15, 45, 40);  //输出  2019-01-05T15:45:40
  • LocalDateTime parse = LocalDateTime.parse("2019-01-05T15:45:40");  //输出  2019-01-05T15:45:40
  • LocalDateTime parse1 = LocalDateTime.parse("2019-01-05 15:45:40", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); //输出  2019-01-05T15:45:40

5.2 LocalDateTIme常用方与LocatDate的同名方法作用相同,LocalDateTIme可以获取所有的字段信息,并且可以转换成LocalDate和LocalTime。

大部分使用的方法几乎都在上面了,其他Time相关API可以在使用的时自行查找。

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值