全面解析Java日期时间API( 三 )

现在的Date类中大部分方法已经弃用,现在一般使用旧的API,Date只负责存储一个时间,并对Calendar和DateFormat提供操作接口 。Calendar获取Date中特定的信息,对日期时间进行操作,SimpleDateFormat对日期时间进行格式化输入输出 。

总的来说,Date、Calendar 和 DateFormat 已经能够处理一般的时间日期问题了 。但是不可避免的是,它们依然很繁琐,不好用并且这些日期类都是可变且线程不安全的
Joda-Time
详情请查看https://www.ibm.com/developerworks/cn/java/j-jodatime.html
Java 8 时间日期API
特性
  • 不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程很有好处 。
  • 关注点分离:借鉴了Joda库的一些优点,新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类 。
  • 清晰:在所有的类中,方法都被明确定义用以完成相同的行为 。例如要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类 。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难 。
  • 实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等 。
  • 可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非IOS的日历上 。
Java8日期时间的默认格式如下:yyyy-MM-dd-HH-mm-ss.zzz
几个主要的核心类:
  • LocalDate:日期类,不带时间
  • LocalTime:时间类,不带日期
  • LocalDateTime:日期和时间类
  • ZonedDateTime:时区日期时间类
  • OffsetDateTime:按UTC时间偏移来得到日期时间
  • Clock:获取某个时区下当前的瞬时时间,日期或者时间
  • Instant:Unix时间,代表时间戳,比如 2018-01-14T02:20:13.592Z
  • Duration:两个时间之间,表示一个绝对的精确跨度,使用毫秒为单位
  • Period:两个日期之间
  • ZoneId:时区
  • DateTimeFormatter:格式化输出
  • TemporalAdjusters:获得指定日期时间等,如当月的第一天、今年的最后一天等等
下面看看这些类具体如何使用
LocalDate、LocalTime、LocalDateTime
LocalDate是不变的日期时间对象代表一个日期,往往被视为年月日 。其他日期字段,如一年中的一天,一周和一周的一天,也可以访问 。例如,“2007年10月2日”的值可以被存储在一个LocalDate 。
LocalTime是不变的日期时间对象代表一个时间,往往被视为小时分钟秒 。时间为代表的纳秒级精度 。例如,值“13:45.30.123456789”可以存储在一个LocalTime 。
LocalDateTime是不变的日期时间对象代表一个日期时间,往往被视为年、月、日、时、分、秒 。其他日期和时间字段,如一年中的一天,一周和一周的一天,也可以访问 。时间为代表的纳秒级精度 。例如,值“2007年10月2日在13:45.30.123456789”可以存储在一个LocalDateTime 。
//now()在默认时区中从系统时钟获取当前日期 。LocalDate today = LocalDate.now();LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); //等价于 today.plusWeeks(1)//of(int year, int month, int dayOfMonth) 获得 LocalDate实例从一年、月、日 。LocalDate date = LocalDate.of(2019,5,31);LocalTime time = LocalTime.of(20,31,20);//of(LocalDate date, LocalTime time) 获得 LocalDateTime实例的日期和时间 。LocalDateTime dateTime = LocalDateTime.of(date,time);System.out.println(dateTime);//LocalDate结合LocalTime成一个LocalDateTimeLocalDateTime dateTime2 = date.atTime(time);System.out.println(dateTime2); //2019-05-31T20:31:20DateTimeFormatter
格式器用于解析日期字符串和格式化日期输出,创建格式器最简单的方法是通过 DateTimeFormatter 的静态工厂方法以及常量 。创建格式器一般有如下三种方式:
  1. 常用 ISO 格式常量,如 ISO_LOCAL_DATE
  2. 字母模式,如 ofPattern("yyyy/MM/dd")
  3. 本地化样式,如 ofLocalizedDate(FormatStyle.MEDIUM)
和旧的 java.util.DateFormat 相比较,所有的 DateTimeFormatter 实例都是线程安全的 。
使用DateTimeFormatter完成格式化
//获取默认时区中从系统时钟获取当前日期时间 。LocalDateTime localDateTime = LocalDateTime.now();//创建一个格式化程序使用指定的模式 。DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatDateTime = localDateTime.format(formatter);System.out.println(formatDateTime);//DateTimeFormatter提供了一些默认的格式化器,DateTimeFormatter.ISO_LOCAL_DATE_TIME 格式 yyyy-MM-ddTHH:mm:ss.SSSString dateTime2 = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);System.out.println(dateTime2);


推荐阅读