
題圖:by pixel2013 From pixabay
上期我們介紹了Java8中的
Optional,本期我們介紹Java8中新的時間日期API。
JSR
在講之前,首先講一下JSR,什么是JSR呢?Java Specification Requests,是Java規(guī)范提案。
常見的JSR有:
-
JSR-303參數(shù)驗證 -
JSR-310時間 -
JSR-311Restful API規(guī)范
JSR-310即時間規(guī)范標(biāo)準(zhǔn):
在Java8之前,操作時間日期的類為:Date和Calendar,第三方包如Joda-time
在Java8中,新增了許多時間日期API
Joda-time
引入Maven依賴
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
核心類
- Instant:不可變的類,用來表示時間軸上一個瞬時的點
- DateTime:不可變的類,用來替換JDK的Calendar類
- LocalDate:不可變的類,表示一個本地的日期,而不包含時間部分(沒有時區(qū)信息)
- LocalTime:不可變的類,表示一個本地的時間,而不包含日期部分(沒有時區(qū)信息)
- LocalDateTime:不可變的類,表示一個本地的日期-時間(沒有時區(qū)信息)
用法舉例
public static void main(String[] args) {
DateTime today = DateTime.now();
DateTime tomorrow = today.plusDays(1);
DateTime oneHourAfter = today.plusHours(1);
System.out.println(today.toString());
System.out.println(tomorrow.toString());
System.out.println(oneHourAfter.toString());
DateTime day = new DateTime(2017,12,30,17,47,30);
System.out.println(day.dayOfYear().getAsString());
System.out.println(day.dayOfMonth().getAsString());
System.out.println(day.dayOfWeek().getAsString());
}
結(jié)果:
2017-12-30T17:49:24.065+08:00
2017-12-31T17:49:24.065+08:00
2017-12-30T18:49:24.065+08:00
364
30
6
如果用過Joda-time的,那么Java8中新的時間日期API就很容易上手了。
Java8中新的時間日期API
LocalDate/LocalTime/LocalDateTime
- now() :根據(jù)當(dāng)前時間創(chuàng)建對象
- of():根據(jù)指定日期/時間創(chuàng)建對象
- plusDays/plusWeeks/plusMonths/plusYears 時間向后推移
- minusDays/minusWeeks/minusMonths/minusYears 時間向前推移
- plus/minus
- withDayOfMonth/withDayOfYear/withMonth/withYear 修改
- getDayOfMonth 獲得月份天數(shù)(1-31)
- getDayOfYear 獲得年份天數(shù)(1-366)
- getDayOfWeek 獲得星期幾(返回一個 DayOfWeek 枚舉值)
- getMonth 獲得月份, 返回一個 Month 枚舉值
- getMonthValue 獲得月份(1-12)
- getYear 獲得年份
- until 獲得兩個日期之間的 Period 對象, 或者指定 ChronoUnits 的數(shù)字
- isBefore/isAfter 比較兩個 LocalDate
- isLeapYear 判斷是否是閏年
Instant 時間戳
用于“時間戳”的運(yùn)算。它是以Unix元年(傳統(tǒng) 的設(shè)定為UTC時區(qū)1970年1月1日午夜時分)開始 所經(jīng)歷的描述進(jìn)行運(yùn)算。
Duration 和 Period
- Duration:用于計算兩個“時間”間隔,Duration.between...
- Period:用于計算兩個“日期”間隔,Period.between...
Clock 時鐘
Clock類提供了訪問當(dāng)前日期和時間的方法,Clock是時區(qū)敏感的,可以用來取代System.currentTimeMillis() 來獲取當(dāng)前的微秒數(shù)。某一個特定的時間點也可以使用Instant類來表示,Instant類也可以用來創(chuàng)建老的java.util.Date對象。
Clock clock = Clock.systemDefaultZone();
long millis = clock.millis();
Instant instant = clock.instant();
Date date = Date.from(instant);
日期的操作
- TemporalAdjuster:時間校正器。有時我們可能需要獲取例如:將日期調(diào)整到“下個周日”等操作。
- TemporalAdjusters:該類通過靜態(tài)方法提供了大量的常用TemporalAdjuster的實現(xiàn)。
解析與格式化
java.time.format.DateTimeFormatter類:該類提供了三種格式化方法:
- 預(yù)定義的標(biāo)準(zhǔn)格式
- 語言環(huán)境相關(guān)的格式
- 自定義的格式
DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
時區(qū)的處理
Java8中加入了對時區(qū)的支持,帶時區(qū)的時間為分別為:
- ZonedDate
- ZonedTime
- ZonedDateTime
其中每個時區(qū)都對應(yīng)著ID,地區(qū)ID都為 “{區(qū)域}/{城市}”的格式 例如 :Asia/Shanghai等,ZoneId:該類中包含了所有的時區(qū)信息
- getAvailableZoneIds() : 可以獲取所有時區(qū)時區(qū)
- of(id) : 用指定的時區(qū)信息獲取 ZoneId 對象