博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 8新特性之-- Date-Time API(LocalDate/Time/DateTime 日期时间API)
阅读量:2144 次
发布时间:2019-04-30

本文共 4827 字,大约阅读时间需要 16 分钟。

一、概要

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-15LocalDate 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可以在使用的时自行查找。

(完)

转载地址:http://gqhgf.baihongyu.com/

你可能感兴趣的文章
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
VS生成DLL文件供第三方调用
查看>>
Android Studio color和font设置
查看>>
Python 格式化打印json数据(展开状态)
查看>>
Centos7 安装curl(openssl)和libxml2
查看>>