18個 Java8 日期處理的實踐,太有用了!

2021-02-20 小黑格子屋

連結:juejin.im/post/5a795bad6fb9a0634f407ae5Java 8 推出了全新的日期時間API,在教程中我們將通過一些簡單的實例來學習如何使用新API。
Java處理日期、日曆和時間的方式一直為社區所詬病,將 java.util.Date設定為可變類型,以及SimpleDateFormat的非線程安全使其應用非常受限。新API基於ISO標準日曆系統,java.time包下的所有類都是不可變類型而且線程安全。

示例1:Java 8中獲取今天的日期Java 8 中的 LocalDate 用於表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo01 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期:"+today);
    }
}


示例2:Java 8中獲取年、月、日信息

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo02 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();

        System.out.println("year:"+year);
        System.out.println("month:"+month);
        System.out.println("day:"+day);

    }
}


示例3:Java 8中處理特定日期


我們通過靜態工廠方法now()非常容易地創建了當天日期,你還可以調用另一個有用的工廠方法LocalDate.of()創建任意日期, 該方法需要傳入年、月、日做參數,返回對應的LocalDate實例。這個方法的好處是沒再犯老API的設計錯誤,比如年度起始於1900,月份是從0開 始等等。

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo03 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2018,2,6);
        System.out.println("自定義日期:"+date);
    }
}


示例4:Java 8中判斷兩個日期是否相等

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo04 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.now();

        LocalDate date2 = LocalDate.of(2018,2,5);

        if(date1.equals(date2)){
            System.out.println("時間相等");
        }else{
            System.out.println("時間不等");
        }

    }
}

示例5:Java 8中檢查像生日這種周期性事件

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.MonthDay;

public class Demo05 {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.now();

        LocalDate date2 = LocalDate.of(2018,2,6);
        MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(date1);

        if(currentMonthDay.equals(birthday)){
            System.out.println("是你的生日");
        }else{
            System.out.println("你的生日還沒有到");
        }

    }
}

只要當天的日期和生日匹配,無論是哪一年都會列印出祝賀信息。你可以把程序整合進系統時鐘,看看生日時是否會受到提醒,或者寫一個單元測試來檢測代碼是否運行正確。示例6:Java 8中獲取當前時間

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo06 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println("獲取當前的時間,不含有日期:"+time);

    }
}

示例7:Java 8中獲取當前時間通過增加小時、分、秒來計算將來的時間很常見。Java 8除了不變類型和線程安全的好處之外,還提供了更好的plusHours()方法替換add(),並且是兼容的。注意,這些方法返回一個全新的LocalTime實例,由於其不可變性,返回後一定要用變量賦值。

package com.shxt.demo02;

import java.time.LocalTime;

public class Demo07 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(3);
        System.out.println("三個小時後的時間為:"+newTime);

    }
}


示例8:Java 8如何計算一周後的日期和上個例子計算3小時以後的時間類似,這個例子會計算一周後的日期。LocalDate日期不包含時間信息,它的plus()方法用來增加天、周、月,ChronoUnit類聲明了這些時間單位。由於LocalDate也是不變類型,返回後一定要用變量賦值。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Demo08 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期為:"+today);
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("一周後的日期為:"+nextWeek);

    }
}

可以看到新日期離當天日期是7天,也就是一周。你可以用同樣的方法增加1個月、1年、1小時、1分鐘甚至一個世紀,更多選項可以查看Java 8 API中的ChronoUnit類。示例9:Java 8計算一年前或一年後的日期

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Demo09 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
        System.out.println("一年前的日期 : " + previousYear);

        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
        System.out.println("一年後的日期:"+nextYear);

    }
}


示例10:Java 8的Clock時鐘類Java 8增加了一個Clock時鐘類用於獲取當時的時間戳,或當前時區下的日期時間信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替換。

package com.shxt.demo02;

import java.time.Clock;

public class Demo10 {
    public static void main(String[] args) {
        // Returns the current time based on your system clock and set to UTC.
        Clock clock = Clock.systemUTC();
        System.out.println("Clock : " + clock.millis());

        // Returns time based on system clock zone
        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println("Clock : " + defaultClock.millis());

    }
}


示例11:如何用Java判斷日期是早於還是晚於另一個日期


另一個工作中常見的操作就是如何判斷給定的一個日期是大於某天還是小於某天?在Java 8中,LocalDate類有兩類方法isBefore()和isAfter()用於比較日期。調用isBefore()方法時,如果給定日期小於當前日期則返回true。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;


public class Demo11 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate tomorrow = LocalDate.of(2018,2,6);
        if(tomorrow.isAfter(today)){
            System.out.println("之後的日期:"+tomorrow);
        }

        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
        if(yesterday.isBefore(today)){
            System.out.println("之前的日期:"+yesterday);
        }
    }
}


示例12:Java 8中處理時區


Java 8不僅分離了日期和時間,也把時區分離出來了。現在有一系列單獨的類如ZoneId來處理特定時區,ZoneDateTime類來表示某時區下的時間。這在Java 8以前都是 GregorianCalendar類來做的。下面這個例子展示了如何把本時區的時間轉換成另一個時區的時間。

package com.shxt.demo02;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Demo12 {
    public static void main(String[] args) {
        // Date and time with timezone in Java 8
        ZoneId america = ZoneId.of("America/New_York");
        LocalDateTime localtDateAndTime = LocalDateTime.now();
        ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
        System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);
    }
}


示例13:如何表示信用卡到期這類固定日期,答案就在YearMonth與 MonthDay檢查重複事件的例子相似,YearMonth是另一個組合類,用於表示信用卡到期日、FD到期日、期貨期權到期日等。還可以用這個類得到 當月共有多少天,YearMonth實例的lengthOfMonth()方法可以返回當月的天數,在判斷2月有28天還是29天時非常有用。

package com.shxt.demo02;

import java.time.*;

public class Demo13 {
    public static void main(String[] args) {
        YearMonth currentYearMonth = YearMonth.now();
        System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
        YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);
        System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
    }
}


示例14:如何在Java 8中檢查閏年

package com.shxt.demo02;

import java.time.LocalDate;

public class Demo14 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        if(today.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2018 is not a Leap year");
        }

    }
}


示例15:計算兩個日期之間的天數和月數有一個常見日期操作是計算兩個日期之間的天數、周數或月數。在Java 8中可以用java.time.Period類來做計算。下面這個例子中,我們計算了當天和將來某一天之間的月數。

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.Period;

public class Demo15 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate java8Release = LocalDate.of(2018, 12, 14);

        Period periodToNextJavaRelease = Period.between(today, java8Release);
        System.out.println("Months left between today and Java 8 release : "
                + periodToNextJavaRelease.getMonths() );


    }
}


示例16:在Java 8中獲取當前的時間戳Instant類有一個靜態工廠方法now()會返回當前的時間戳,如下所示:

package com.shxt.demo02;

import java.time.Instant;

public class Demo16 {
    public static void main(String[] args) {
        Instant timestamp = Instant.now();
        System.out.println("What is value of this instant " + timestamp.toEpochMilli());
    }
}

時間戳信息裡同時包含了日期和時間,這和java.util.Date很像。實際上Instant類確實等同於 Java 8之前的Date類,你可以使用Date類和Instant類各自的轉換方法互相轉換,例如:Date.from(Instant) 將Instant轉換成java.util.Date,Date.toInstant()則是將Date類轉換成Instant類。示例17:Java 8中如何使用預定義的格式化工具去解析或格式化日期

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Demo17 {
    public static void main(String[] args) {
        String dayAfterTommorrow = "20180205";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
                DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(dayAfterTommorrow+" 格式化後的日期為: "+formatted);
    }
}

示例18:字符串互轉日期類型

package com.shxt.demo02;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Demo18 {
    public static void main(String[] args) {
        LocalDateTime date = LocalDateTime.now();

        DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        //日期轉字符串
        String str = date.format(format1);

        System.out.println("日期轉換為字符串:"+str);

        DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        //字符串轉日期
        LocalDate date2 = LocalDate.parse(str,format2);
        System.out.println("日期類型:"+date2);

    }
}

相關焦點

  • 18 個 Java8 日期處理的實踐,太有用了!
    示例1:Java 8中獲取今天的日期Java 8 中的 LocalDate 用於表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。你可以用同樣的方法增加1個月、1年、1小時、1分鐘甚至一個世紀,更多選項可以查看Java 8 API中的ChronoUnit類。
  • 18個Java8日期處理的實踐,太有用了!
    我們通過靜態工廠方法now()非常容易地創建了當天日期,你還可以調用另一個有用的工廠方法LocalDate.of()創建任意日期, 該方法需要傳入年、月、日做參數,返回對應的LocalDate實例。LocalTime newTime = time.plusHours(3);        System.out.println("三個小時後的時間為:"+newTime);    }}示例8:Java 8如何計算一周後的日期和上個例子計算3小時以後的時間類似,這個例子會計算一周後的日期。
  • 18 個示例帶你掌握 Java 8 日期時間處理!
    包含日期和時間,比如:2018-02-05 23:14:21java.time.format.DateTimeFormatterJava 8 中的 LocalDate 用於表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。
  • 程式設計師必備:Java日期處理的十個坑
    前言整理了Java日期處理的十個坑,希望對大家有幫助。
  • 別用 Date 了,使用 Java8 日期處理的新特性,真香!
    Java處理日期、日曆和時間的不足之處:將 java.util.Date 設定為可變類型,以及 SimpleDateFormat 的非線程安全使其應用非常受限。然後就在 java8 上面增加新的特性。獲取當前的日期Java 8 中的LocalDate用於表示當天日期。和 java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。
  • 死磕18個Java8日期處理,工作必用!
    獲取當前的日期Java 8 中的 LocalDate 用於表示當天日期。和 java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。4.判斷兩個日期是否相等現實生活中有一類時間處理就是判斷兩個日期是否相等。在項目開發的時候總會遇到這樣子的問題。下面這個例子會幫助你用Java 8的方式去解決,LocalDate 重載了equal方法。
  • 徹底弄透Java處理GMT/UTC日期時間
    本系列的目的是明明白白、徹徹底底的搞定日期/時間處理的幾乎所有case。上篇文章 鋪設所有涉及到的概念解釋,例如GMT、UTC、夏令時、時間戳等等,若你還沒看過,不僅強烈建議而是強制建議你前往用花5分鐘看一下,因為日期時間處理較為特殊,實戰必須基於對概念的了解,否則很可能依舊霧裡看花。
  • Java 8新的時間日期庫的20個使用示例
    在一個真實的項目中會有各種各樣的需求,這會促使開發人員去探索和研究這個新庫。簡言之,只有任務本身才會真正促使你去探索及學習。java 8的新的日期及時間API也是一樣。為了學習Java 8的這個新庫,這裡我創建了20個以任務為導向的例子。
  • 9 個 Java 處理 Exception 的最佳實踐!好用~
    在Finally塊中清理資源或者使用try-with-resource語句在Java中處理異常並不是一個簡單的事情。不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。
  • Java 處理 Exception 的 9 個最佳實踐!
    在Java中處理異常並不是一個簡單的事情。不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。這也是絕大多數開發團隊都會制定一些規則來規範對異常的處理的原因。而團隊之間的這些規範往往是截然不同的。
  • Java 日期時間處理
    Calendar由於Date存在缺陷,所以JDK又提供了java.util.Calendar來處理日期和時間.Calendar是一個抽象類,是所有日曆類的模板,因此,我們可以繼承Calendar來實現其他的曆法(比如陰曆);Java中提供了一種Calendar的默認實現java.util.GregorianCalendar
  • Java處理Exception的9個最佳實踐
    不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。這也是絕大多數開發團隊都會制定一些規則來規範對異常的處理的原因。而團隊之間的這些規範往往是截然不同的。本文給出幾個被很多團隊使用的異常處理最佳實踐。1.
  • Java 處理 Exception 的 9 個最佳實踐
    不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。這也是絕大多數開發團隊都會制定一些規則來規範對異常的處理的原因。而團隊之間的這些規範往往是截然不同的。1.
  • Java中異常處理的9個最佳實踐
    ,初學者經常陷入困惑,甚至有經驗的開發者也需要認真研討哪些異常需要處理,哪些異常需要向上拋出。導致每個開發團隊都會自己定製一套特有的異常處理規則,這使得新加入團隊的成員都經歷一段痛苦的適應期。儘管如此,前輩們依然總結了幾個最佳實踐可以遵循,這些實踐被絕大多數的團隊所採用,本文將為你列出9個最常用且最重要的實踐來幫助你提升異常處理的技能。
  • Java 8 日期 / 時間( Date Time )API 指南
    Java 8日期/時間( Date/Time)API是開發人員最受追捧的變化之一,Java從一開始就沒有對日期時間處理的一致性方法,因此日期/時間API也是除Java核心API以外另一項倍受歡迎的內容。
  • Java 異常處理的 9 個最佳實踐
    所以很多開發團隊約定一些原則處理異常。如果你是一個團隊的新成員,你可能會很驚訝,因為他們約定的規則可能和你以前使用的規則不一樣。不過,有很多最佳實踐的規則,被大部分團隊接受。這裡有 9 大重要的約定,幫助你學習或者改進異常處理。
  • Java 中 9 個處理 Exception 的最佳實踐
    /如有好文章投稿,請點擊 → 這裡了解詳情在Java中處理異常並不是一個簡單的事情。不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。這也是絕大多數開發團隊都會制定一些規則來規範對異常的處理的原因。而團隊之間的這些規範往往是截然不同的。本文給出幾個被很多團隊使用的異常處理最佳實踐。1.
  • 一網打盡 java 8 的日期用法
    java 已經出到 17 了,而小編還在用 8 的版本,在 8 中已經推出了新的日期 API,不在使用 。java.time 包下提供了用於日期、時間、實例和周期的主要 API。獲取今天日期LocalDate 存儲了日期,如:2022-01-09,它不包含時間。
  • Java 中處理 Exception 的最佳實踐
    在Java中處理異常並不是一個簡單的事情。不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。這也是絕大多數開發團隊都會制定一些規則來規範對異常的處理的原因。而團隊之間的這些規範往往是截然不同的。本文給出幾個被很多團隊使用的異常處理最佳實踐。 1.
  • Java8 新特性之日期-時間 API
    在Java8之前的版本中,我們處理時間類型常常使用的是java.util包下的Date類。但使用Date類卻有諸多的弊端,如:java.util.Date是非線程安全的,所有的日期類都是可變的;日期/時間類的定義並不一致,在java.util和java.sql的包下都含有Date類,在開發過程中極易出錯;日期類並不提供國際化,沒有時區支持。