Java8新特性系列(時間/日期)

題圖:by pixel2013 From pixabay

上期我們介紹了Java8中的Optional,本期我們介紹Java8中新的時間日期API。

JSR

在講之前,首先講一下JSR,什么是JSR呢?Java Specification Requests,是Java規(guī)范提案。
常見的JSR有:

  • JSR-303 參數(shù)驗證
  • JSR-310 時間
  • JSR-311 Restful API規(guī)范

JSR-310即時間規(guī)范標(biāo)準(zhǔn):

在Java8之前,操作時間日期的類為:DateCalendar,第三方包如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類:該類提供了三種格式化方法:

    1. 預(yù)定義的標(biāo)準(zhǔn)格式
    1. 語言環(huán)境相關(guān)的格式
    1. 自定義的格式
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ū)信息

    1. getAvailableZoneIds() : 可以獲取所有時區(qū)時區(qū)
    1. of(id) : 用指定的時區(qū)信息獲取 ZoneId 對象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容