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

2021-03-02 小黑格子屋

連結: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日期處理的實踐,太有用了!
    我們通過靜態工廠方法now()非常容易地創建了當天日期,你還可以調用另一個有用的工廠方法LocalDate.of()創建任意日期, 該方法需要傳入年、月、日做參數,返回對應的LocalDate實例。LocalTime newTime = time.plusHours(3);        System.out.println("三個小時後的時間為:"+newTime);    }}示例8:Java 8如何計算一周後的日期和上個例子計算3小時以後的時間類似,這個例子會計算一周後的日期。
  • 18 個 Java 8 日期處理的工具類
    示例1:Java 8中獲取今天的日期Java 8 中的 LocalDate 用於表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。我們通過靜態工廠方法now()非常容易地創建了當天日期,你還可以調用另一個有用的工廠方法LocalDate.of()創建任意日期, 該方法需要傳入年、月、日做參數,返回對應的LocalDate實例。
  • 18 個示例帶你掌握 Java 8 日期時間處理!
    和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。    }}示例8:Java 8如何計算一周後的日期和上個例子計算3小時以後的時間類似,這個例子會計算一周後的日期。
  • 9 個 Java 處理 Exception 的最佳實踐!好用~
    在Finally塊中清理資源或者使用try-with-resource語句在Java中處理異常並不是一個簡單的事情。不僅僅初學者很難理解,即使一些有經驗的開發者也需要花費很多時間來思考如何處理異常,包括需要處理哪些異常,怎樣處理等等。
  • Java 8 新日期API 計算下個工作日的方式如此簡單
    導述Java 8 中引入了新的日期處理包 java.time.日期相關:LocalDate 時間:LocalDateTime 時間戳:Instant 持續時間:Duration 時區控制:ZonedDateTime這幾個類以及可以實現所有日期相關的操作,而且還可以進行自定義操作。比如現在需要計算下個工作日的時間,應該如何進行處理呢?
  • 一文告訴你Java日期時間API到底有多爛
    平時我們都熱衷於吐槽同事的代碼有多爛,今天我們就來玩點狠的:吐槽吐槽JDK,看看它的日期時間API設計得到底有多爛。❝說明:本文指的日期時間API是Date/Calendar系列,而非Java 8新的API。畢竟一般我們稱後者為JSR 310日期時間,請注意區分哈❞本文提綱
  • Java 8裡面 lambda 的最佳實踐
    人們開發了java.util.concurrent包和很多第三方類庫,試圖將並發抽象化,用以幫助程式設計師寫出在多核CPU上運行良好的程序。不幸的是,到目前為止,我們走得還不夠遠。那些類庫的開發者使用Java時,發現抽象的級別還不夠。處理大數據就是個很好的例子,面對大數據Java還欠缺高效的並行操作。
  • 別用Date了,Java8新特性之日期處理,現在學會也不遲!
    獲取當前的日期Java 8 中的 LocalDate 用於表示當天日期。和 java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。4.判斷兩個日期是否相等現實生活中有一類時間處理就是判斷兩個日期是否相等。在項目開發的時候總會遇到這樣子的問題。下面這個例子會幫助你用Java 8的方式去解決, LocalDate 重載了equal方法。
  • Java基礎篇(04):日期與時間API用法詳解
    在時間和日期中有幾個關鍵概念:日期和時間的用法在系統中通常是獲取時間和一些常見的計算與格式轉換處理,在一些垮時區的業務中就會變的複雜很多,例如在電商業務中的全球貿易或者海淘等。,Calendar複雜相關計算策略,DateFormat依舊用來做格式處理。
  • Java 8時間類,越用越香
    為什麼會在Jdk8中加入很多時間類非線程安全java.util.Date 是非線程安全的,所有的日期類都是可變的而java8中日期和時間基本都被設計final,final修飾的類,天然線程安全。設計很差java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,兩個類又有相同的名字,令人匪夷所思。
  • java日期和時間的格式化
    在編寫程序時,經常需要對日期進行格式化輸出。使用String類的format方法可以實現對日期和時間的格式化輸出。日期的格式化輸出Java提供了日期格式化轉換符用於支持日期的格式化輸出,格式化轉換符如下表所示: 案例1:使用API庫的Date類獲取當前日期和時間信息,並用format()方法將日期格式化為
  • 聽說你還在用SimpleDateFormat格式化日期
    作者:程式設計師內點事說在前邊最近部門幾位同事受了一些委屈相繼離職,共事三年臨別之際頗有不舍,待一切手續辦妥帖,寒暄過後送他們出公司,幾個老哥臨別時衝我鬼魅一笑,我頓時心裡一緊有種不好的預感,這事絕對沒有這麼簡單。等我接手這幾個大佬的項目後,應驗了我的預感,此刻我居然有點後悔,為啥送別之時沒揍他們一頓!
  • 輕課· Java|Java 日期時間
    第一個構造函數使用當前日期和時間來初始化對象。第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。8int hashCode( ) 返回此對象的哈希碼值。9void setTime(long time) 用自1970年1月1日00:00:00 GMT以後time毫秒數設置時間和日期。
  • 體驗了一下Java 8 異步 API、循環、日期,還真挺好!
    ,在以前我們用 Thread 或者 Runnable 來實現異步,這是oracle官方做法,不過缺點很明顯現在,java8為我們提供了CompletableFuture類,可以完全解決以上問題。    CompletableFuture<Object> any = CompletableFuture.anyOf(a,b,c);    String result = (String)any.get();    System.out.println(result);}循環ForEachjava8
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    一個好的系統的異常對於開發者來說,處理應該統一,避免各處散落很多異常處理邏輯;對於系統來說,異常應該是可控的,並且是易於運維的,某些異常出現後,應該有應對的方法,知道如何運維處理,所以雖然異常框架很簡單,但是對於整個企業級應用開發來說,異常處理是很重要的,處理好異常就需要了解Java中的異常體系。
  • java中定義日期格式的轉換符
    運行結果如下所示:今天就到此結束了,如果大家有什麼不懂的地方歡迎留言或私信,有什麼錯誤的地方歡迎大家批評指正,謝謝大家!java中如重複提供日期java中日期和時間的格式化編碼java中使用printf格式化獲取當前日期
  • 你必須掌握的 21 個 Java 核心技術!
    這個知識點是最最基本的java開發者需要掌握的,第一個肯定是教你如何在命令行中執行java程序,但是很多人一旦把java學完了,IDE用上了,就把這個都忘了。多線程用好了可以有效提高cpu使用率, 提升整體系統效率, 特別是在有大量IO操作阻塞的情況下;這裡整理的Java多線程面試題及答案你必須都要清楚。但是它也是一柄雙刃劍, 如果用不好,系統非但提升不大,或者沒有提升,而且還會帶來多線程之間的調試時等問題。
  • Java的21個技術點和知識點歸納
    >  8.多線程用好了可以有效提高cpu使用率, 提升整體系統效率, 特別是在有大量IO操作阻塞的情況下;但是它也是一柄雙刃劍, 如果用不好,系統非但提升不大,或者沒有提升,而且還會帶來多線程之間的調試時等問題。  在多線程中內容有很多,只是簡單說明一下Java中初步使用多線程需要掌握的知識點,以後有機會單獨再詳細介紹一些高級特性的使用場景。
  • 函數的計算機處理8(13)_3javaJDK14
    計算機語言運用--數值計算8-函數的計算機處理8(13)_3javaJDK14……接上一講……函數有三種基本的表達形式
  • Java中日期的幾種常見操作 ―― 取值、轉換、加減、比較
    Java 的開發過程中免不了與 Date 類型糾纏,準備總結一下項目經常使用的日期相關操作,JDK 版本 1.7,如果能夠幫助大家節約那麼幾分鐘起身活動一下,去泡杯咖啡,便是極好的,嘿嘿。當然,我只提供了可行的解決方案,並不保證是最佳實踐,歡迎討論。