JDK8的時間處理

本文轉載自:https://mp.weixin.qq.com/s/bbuItfxLgemJRuFb6iqWzA


當前時間:2019年12月27日。距離 JDK 14 發佈時間(2020年3月17日)還有多少天?

// 距離JDK 14 發佈還有多少天?
LocalDate jdk14 = LocalDate.of(2020, 3, 17);
LocalDate nowDate = LocalDate.now();
System.out.println("距離JDK 14 發佈還有:"+nowDate.until(jdk14,ChronoUnit.DAYS)+"天");

JDK 8 已經在 2014年 3月 18日正式可用 ,距離現在已經 5年多時間過去了。5年時間裏很多企業也都換上了 JDK 8,明年 3月份 Jdk14 也要來了,那麼 Jdk 8 的新特性你真的用起來了嗎?我準備寫一個 Jdk 8開始的新特性介紹以及使用的系列文章,後續 Jdk 也會繼續更新,你如果需要的話不妨關注下博客或者公衆號。

1. 時間處理類

Jdk8 帶來了全新的時間處理工具類,用於代替之前存在缺陷的時間處理。新的時間處理相比之前更加簡單好用。


Jdk8 時間處理類

常用的類有以下幾個類。

時間相關類 介紹
LocalDateTime 時間處理類,最高精確到納秒
LocalDate 時間處理類,最高精確到天
DateTimeFormatter 時間格式化
ZoneId 時區設置類

2. 時間獲取

使用不同的類可以獲取不同精度的時間。

/**
 * 時間獲取
*/
@Test
public void nowTimeTest() {
    // 當前精確時間
    LocalDateTime now = LocalDateTime.now();
    System.out.println("當前精確時間:" + now);
    System.out.println("當前精確時間:" + now.getYear() + "-" + now.getMonthValue() + "-" + now.getDayOfMonth() + " " + now.getHour() + "-" + now.getMinute() + "-" + now.getSecond());

    // 獲取當前日期
    LocalDate localDate = LocalDate.now();
    System.out.println("當前日期:" + localDate);
    System.out.println("當前日期:" + localDate.getYear() + "-" + localDate.getMonthValue() + "-" + localDate.getDayOfMonth());

    // 獲取當天時間
    LocalTime localTime = LocalTime.now();
    System.out.println("當天時間:" + localTime);
    System.out.println("當天時間:" + localTime.getHour() + ":" + localTime.getMinute() + ":" + localTime.getSecond());

    // 有時區的當前精確時間
    ZonedDateTime nowZone = LocalDateTime.now().atZone(ZoneId.systemDefault());
    System.out.println("當前精確時間(有時區):" + nowZone);
    System.out.println("當前精確時間(有時區):" + nowZone.getYear() + "-" + nowZone.getMonthValue() + "-" + nowZone.getDayOfMonth() + " " + nowZone.getHour() + "-" + nowZone.getMinute() + "-" + nowZone.getSecond());
} 

獲取到的時間:

當前精確時間:2019-12-27T09:57:20.928
當前精確時間:2019-12-27 9-57-20
當前日期:2019-12-27
當前日期:2019-12-27
當天時間:09:57:20.929
當天時間:9:57:20
當前精確時間(有時區):2019-12-27T09:57:20.929+08:00[Asia/Shanghai]
當前精確時間(有時區):2019-12-27 9-57-20

3. 時間創建

可以指定年月日時分秒創建一個時間類,也可以使用字符串直接轉換成時間。

/**
 * 時間創建
 */
@Test
public void createTime() {
    LocalDateTime ofTime = LocalDateTime.of(2019, 10, 1, 8, 8, 8);
    System.out.println("當前精確時間:" + ofTime);

    LocalDate localDate = LocalDate.of(2019, 10, 01);
    System.out.println("當前日期:" + localDate);

    LocalTime localTime = LocalTime.of(12, 01, 01);
    System.out.println("當天時間:" + localTime);eD);
}

創建的時間:

當前精確時間:2019-12-20T10:04:08
當前日期:2019-12-20
當天時間:12:01:01

4. 時間轉換

/**
* 日期轉換
*/
@Test
public void convertTimeTest() {
        LocalDateTime parseTime = LocalDateTime.parse("2019-12-27T10:06:22.222");
        System.out.println("字符串時間轉換:" + parseTime);

        LocalDate formatted = LocalDate.parse("20191227", DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("字符串時間轉換-指定格式:" + formatted);

        // Date 轉換成 LocalDateTime
        Date date = new Date();
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println("Date 轉換成 LocalDateTime:" + LocalDateTime.ofInstant(date.toInstant(), zoneId));

        // LocalDateTime 轉換成 Date
        LocalDateTime localDateTime = LocalDateTime.now();
        Date toDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println("LocalDateTime 轉換成 Date:" + toDate);

        // 當前時間轉時間戳
        long epochMilli = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
        System.out.println("當前時間轉時間戳:" + epochMilli);
        // 時間戳轉換成時間
        LocalDateTime epochMilliTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
        System.out.println("時間戳轉換成時間:" + epochMilliTime);
}

轉換結果:

字符串時間轉換:2019-12-27T10:06:22.222
字符串時間轉換-指定格式:2019-12-27
Date 轉換成 LocalDateTime:2019-12-27T10:06:52.855
LocalDateTime 轉換成 Date:Fri Dec 27 10:06:52 CST 2019
當前時間轉時間戳:1577412412866
時間戳轉換成時間:2019-12-27T10:06:52.866

5. 時間格式化

/**
 * 日期格式化
 */
@Test
public void formatTest() {
    LocalDateTime now = LocalDateTime.now();
    System.out.println("當前時間:" + now);
    System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE));
    System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_TIME));
    System.out.println("格式化後:" + now.format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss")));
}

格式化後:

當前時間:2019-12-27T10:08:40.152
格式化後:2019-12-27T10:08:40.152
格式化後:2019-12-27
格式化後:10:08:40.152
格式化後:2019-12-27 10:08:40

6. 時間比較

/**
 * 時間比較
 */
@Test
public void diffTest() {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime yestory = now.minusDays(1);
    System.out.println(now + "在" + yestory + "之後嗎?" + now.isAfter(yestory));
    System.out.println(now + "在" + yestory + "之前嗎?" + now.isBefore(yestory));

    // 時間差
    long day = yestory.until(now, ChronoUnit.DAYS);
    long month = yestory.until(now, ChronoUnit.MONTHS);
    long hours = yestory.until(now, ChronoUnit.HOURS);
    long minutes = yestory.until(now, ChronoUnit.MINUTES);
    System.out.println("相差月份" + month);
    System.out.println("相差天數" + day);
    System.out.println("相差小時" + hours);
    System.out.println("相差分鐘" + minutes);

    // 距離JDK 14 發佈還有多少天?
    LocalDate jdk14 = LocalDate.of(2020, 3, 17);
    LocalDate nowDate = LocalDate.now();
    System.out.println("距離JDK 14 發佈還有:" + nowDate.until(jdk14, ChronoUnit.DAYS) + "天");
}

比較結果:

2019-12-27T10:09:51.428在2019-12-26T10:09:51.428之後嗎?true
2019-12-27T10:09:51.428在2019-12-26T10:09:51.428之前嗎?false
相差月份0
相差天數1
相差小時24
相差分鐘1440
距離JDK 14 發佈還有:81天

7. 時間加減

/**
 * 日期加減
 */
@Test
public void calcTest() {
    LocalDateTime now = LocalDateTime.now();
    System.out.println("當前時間:"+now);
    LocalDateTime plusTime = now.plusMonths(1).plusDays(1).plusHours(1).plusMinutes(1).plusSeconds(1);
    System.out.println("增加1月1天1小時1分鐘1秒時間後:" + plusTime);
    LocalDateTime minusTime = now.minusMonths(2);
    System.out.println("減少2個月時間後:" + minusTime);
}

操作結果:

當前時間:2019-12-27T10:12:18.933
增加1月1天1小時1分鐘1秒時間後:2020-01-28T11:13:19.933
減少2個月時間後:2019-10-27T10:12:18.933

8. 時間擴展方法

/**
 * 時間方法
 */
@Test
public void timeFunctionTest() {
    LocalDateTime now = LocalDateTime.now();
    System.out.println("當前時間:" + now);
    // 第一天
    LocalDateTime firstDay = now.withDayOfMonth(1);
    System.out.println("本月第一天:" + firstDay);
    // 當天最後一秒
    LocalDateTime lastSecondOfDay = now.withHour(23).withMinute(59).withSecond(59);
    System.out.println("當天最後一秒:" + lastSecondOfDay);
    // 最後一天
    LocalDateTime lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println("本月最後一天:" + lastDay);
    // 是否閏年
    System.out.println("今年是否閏年:" + Year.isLeap(now.getYear()));
}

輸出結果:

當前時間:2019-12-27T10:13:35.418
本月第一天:2019-12-01T10:13:35.418
當天最後一秒:2019-12-27T23:59:59.418
本月最後一天:2019-12-31T10:13:35.418
今年是否閏年:false

Jdk 8 新的時間類使用起來相比之前顯得更加方便簡單。

JDK8 之前時間處理

Jdk 8 也把時間處理成獨立成一個包,並且使用不同的類名加以區分。而不是像之前相同的類名不同的包。這樣的方式使用起來也更加清晰。

本文轉載自:https://mp.weixin.qq.com/s/bbuItfxLgemJRuFb6iqWzA
如有侵權請聯繫本人進行刪除

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 8103
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章