Java8新特性(时间/日期)
上期我们介绍了Java8中的
Optional
,本期我们介绍Java8中新的时间日期API。
##JSR
在讲之前,首先讲一下JSR,什么是JSR
呢?Java Specification Requests
,是Java规范提案。
常见的JSR有:
JSR-303
参数验证JSR-310
时间JSR-311
Restful API规范
JSR-310
即时间规范标准:
在Java8之前,操作时间日期的类为:Date
和Calendar
,第三方包如**Joda-time
**
在Java8中,新增了许多时间日期API
##Joda-time
####引入Maven依赖
1 | <dependency> |
####核心类
- Instant:不可变的类,用来表示时间轴上一个瞬时的点
- DateTime:不可变的类,用来替换JDK的Calendar类
- LocalDate:不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息)
- LocalTime:不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息)
- LocalDateTime:不可变的类,表示一个本地的日期-时间(没有时区信息)
####用法举例
1 | public static void main(String[] args) { |
结果:
1 | 2017-12-30T17:49:24.065+08:00 |
如果用过Joda-time的,那么Java8中新的时间日期API就很容易上手了。
##Java8中新的时间日期API
####LocalDate/LocalTime/LocalDateTime
- now() :根据当前时间创建对象
- of():根据指定日期/时间创建对象
- plusDays/plusWeeks/plusMonths/plusYears 时间向后推移
- minusDays/minusWeeks/minusMonths/minusYears 时间向前推移
- plus/minus
- withDayOfMonth/withDayOfYear/withMonth/withYear 修改
- getDayOfMonth 获得月份天数(1-31)
- getDayOfYear 获得年份天数(1-366)
- getDayOfWeek 获得星期几(返回一个 DayOfWeek 枚举值)
- getMonth 获得月份, 返回一个 Month 枚举值
- getMonthValue 获得月份(1-12)
- getYear 获得年份
- until 获得两个日期之间的 Period 对象, 或者指定 ChronoUnits 的数字
- isBefore/isAfter 比较两个 LocalDate
- isLeapYear 判断是否是闰年
####Instant 时间戳
用于“时间戳”的运算。它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算。
####Duration 和 Period
- Duration:用于计算两个“时间”间隔,Duration.between…
- Period:用于计算两个“日期”间隔,Period.between…
####Clock 时钟
Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代System.currentTimeMillis() 来获取当前的微秒数。某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象。
1 | Clock clock = Clock.systemDefaultZone(); |
####日期的操作
- TemporalAdjuster:时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
- TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现。
####解析与格式化
java.time.format.DateTimeFormatter类:该类提供了三种格式化方法:
- 预定义的标准格式
- 语言环境相关的格式
- 自定义的格式
1 | DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME; |
####时区的处理
Java8中加入了对时区的支持,带时区的时间为分别为:
- ZonedDate
- ZonedTime
- ZonedDateTime
其中每个时区都对应着ID,地区ID都为 “{区域}/{城市}”的格式 例如 :Asia/Shanghai等,ZoneId:该类中包含了所有的时区信息
- getAvailableZoneIds() : 可以获取所有时区时区
- of(id) : 用指定的时区信息获取 ZoneId 对象