java日期時間API詳解

基於JDK8

下面是基於JDK8來進行編碼和講解的。

重新定義

java8對時間和日期相關的操作進行了重新分類和整理,使得使用起來更加方便和實用。

  • 對時間和日期的相關操作進行了細分:時間、日期、時間&日期,時間戳、時間段、格式化
  • 所有類都是不可變的、線程安全的
  • 兼容舊的日期和時間

API

對於一般來說,常用的API就是下面所列出的六種,在實際使用的過程中,需要哪個就使用哪個來進行操作。

  • LocalDateTime:日期時間
  • LocalDate:僅表示日期
  • LocalTime:僅表示時間
  • Peroid:僅表示日期間隔
  • Duration:時間間隔,以秒和納秒爲單位
  • DateTimeFormatter:可以格式化LocalDate,LocalTime以及LocalDateTime

常見用法

下面分別展示幾個常見的用法,基本涵蓋了常見的使用場景。

  • 獲取當前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 打印結果: 2019-12-05T16:58:11.936
  • 獲取指定時間
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 12, 2, 23, 59, 59);
// 打印結果: 2019-12-02T23:59:59
  • 日期/時間加減操作
// localDateTime2的基礎上加1天零1s
LocalDateTime localDateTime3 = localDateTime2.plusDays(1).plusSeconds(1);
// 打印結果:2019-12-04T00:00
  • 獲取指定的字段(年月日時分秒,納秒,不支持毫秒)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("現在是: " + localDateTime.getYear() + " 年中的第 " + localDateTime.getDayOfYear() +" 天");
// 現在是: 2019 年中的第 339 天 
  • 獲取UTC時間(格林尼治時間)
Instant instant = Instant.now();
// 打印結果:2019-12-05T09:09:21.360Z
  • 獲取北京時間(東8區)
// OffsetTime表示有時差的時間,除了UTC時間,都是OffsetTime
 Instant instant = Instant.now();
 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
// 打印結果: 2019-12-05T17:10:38.330+08:00
  • 獲取毫秒數(1970-01-01T00:00:00Z開始計算)
Instant instant = Instant.now();
long epochMilli = instant.toEpochMilli();
// 打印結果:1575537087543
  • 定義時間戳
Instant instant1 = Instant.ofEpochSecond(59);
// 打印結果: 1970-01-01T00:00:59Z
instant2 = instant1.plusSeconds(99)
// 打印結果:1970-01-01T00:02:38Z
  • 計算日期間隔(參數位置影響結果哦)
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(99);

Duration duration1 = Duration.between(instant1, instant2);
Duration duration2 = Duration.between(instant2, instant1);
// 打印結果 duration1:PT1M39S
// 打印結果 duration2:PT-1M-39S

long duration1Seconds = duration1.getSeconds();
long duration2Seconds = duration1.getSeconds();
// 打印結果 duration1Seconds: 90
// 打印結果 duration2Seconds: -90
  • 操作時間間隔
Duration duration3 = duration1.plusDays(1);
// 打印結果:PT24H1M39S

注意 : 僅支持時間操作(Instant, LocalTime,LocalDateTime),不支持日期(LocalDate)

  • 日期間隔
 LocalDate localDate1 = LocalDate.now();
 LocalDate localDate2 = localDate1.plusDays(1);
 Period period = Period.between(localDate1, localDate2);
 long days =  period.getDays();
 //輸出結果P1D
 //輸出結果1
  • 獲取指定日期或時間
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(20);
// 打印結果 localDateTime1:2019-12-09T11:08:25.055
// 打印結果 localDateTime2:2019-12-20T11:08:25.055
  • 獲取下一個固定日期(下一個星期天)
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
// 打印結果 localDateTime3:2019-12-15T11:09:46.092
  • 定義矯正器
獲取下一個工作日
    LocalDateTime localDateTime4 = localDateTime.with((tempDateTime) -> {
            LocalDateTime localDateTime5 = (LocalDateTime) tempDateTime;
            DayOfWeek dayOfWeek = localDateTime5.getDayOfWeek();
            if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
                    return localDateTime5.plusDays(3);
            } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
                    return localDateTime5.plusDays(2);
            } else {
                    return localDateTime5.plusDays(1);
            }
    });
// 打印結果 localDateTime4:2019-12-10T11:11:57.218
  • 日期時間格式化
 		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.now();
        String dateStr =dateTimeFormatter.format(localDateTime);
        System.out.println(dateStr);
        // 打印結果: 2019-12-09 11:13:40
        LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
        System.out.println(localDateTime2);
        // 打印結果: 2019-12-09T11:13:40
        LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
        System.out.println(localDate);
        // 打印結果: 2019-12-09

基於Instant進行轉換

Java8對於時間戳、日期時間以及老版本的Date對象之間的轉化也進行了兼容和適配,所有轉化操作都可以基於Instant對象進行,下面使用LocalDateTime進行演示

  • 時間戳轉LocalDate,LocalDate,LocalDateTime
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印結果:2019-12-09T11:22:42.629
  • LocalDate,LocalDate,LocalDateTime轉時間戳
LocalDateTime localDateTime = LocalDateTime.now();
long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 打印結果:1575861905995
  • 兼容舊版本Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Date date = Date.from(localDateTime3.atZone(ZoneOffset.ofHours(8)).toInstant());
LocalDateTime localDateTime4  = localDateTime3.atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印結果 date:Mon Dec 09 11:30:04 CST 2019
// 打印結果 lcoalDateTime4:2019-12-09T11:30:04.470
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章