1. 程式人生 > 實用技巧 >JDK8-日期時間新方式

JDK8-日期時間新方式

日期時間新方式

​ 在日常開發中,對於日期操作是非常常見的,但是對於有經驗的開發人員來說Java8之前的日期操作是有較大問題 的。比方說SimpleDateFormat。但是在Java8之後提出了DateTimeFormatter用於解決之前的問題。

SimpleDateFormat的那些坑

SimpleDateFormat本身是執行緒不安全的,同時繼承的DateFormat類也不是執行緒安全的,在多執行緒環境下,如果多個執行緒使用同一個類解析日期,如果將SimpleDateFormat定義為static,所以在多執行緒下它的例項會被多執行緒共享,執行緒之間相互讀取時間,就會出現時間差異和其他的那些異常。

DateTimeFormatter 、LocalDate、LocalTime、LocalDateTime

Java8對於日期時間操作提供了一些新類供我們進行使用,現在可以通過DateTimeFormatter來替換掉 SimpleDateFormat。通過LocalDate、LocalTime、LocalDateTime類來操作日期+時間。而且由原始碼可知,這些類都是不可變更,執行緒安全的類。其內部提供了若干用於操作日期的方法。

DateTimeFormatter 、LocalDate、LocalTime、LocalDateTime的常用方法

/**
 * @author 我是七月呀
 * @date 2020/12/28
 */
public class LocalDateDemp {

    public static void main(String[] args) {

        /**
         * 根據自己需求獲取任意時間,例如:2020-12-28 14:57:00
         * 
         */
        LocalDateTime of = LocalDateTime.of(2020, 12, 28, 14, 57, 00);
        String format = of.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(format);

        /**
         * 注意:這裡的YYYY是表示:當天所在的周屬於的年份,一週從週日開始,週六結束,只要本週跨年,那麼這周就算入下一年。
         * 結果為:2020-12-28 15:39:37
         */
        String formatOne = of.format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"));
        System.out.println(formatOne);


        /**
         * 獲取當前時間的年月日 時分秒,例如:2020-12-28 15:39:37
         */
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format1 = dateTimeFormatter1.format(LocalDateTime.now());
        System.out.println(format1);

        /**
         * 獲取當前時間的年月日,例如:2020-12-28
         */
        DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String format2 = dateTimeFormatter2.format(LocalDateTime.now());
        System.out.println(format2);

        /**
         * 獲取當前時間的時分秒,例如:15:39:37
         */
        DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofPattern("HH:mm:ss");
        String format3 = dateTimeFormatter3.format(LocalDateTime.now());
        System.out.println(format3);

        /**
         * 獲取當前時間的年月日 時分秒(無符號),例如:20201228153937
         */
        DateTimeFormatter dateTimeFormatter4 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String format4 = dateTimeFormatter4.format(LocalDateTime.now());
        System.out.println(format4);

        /**
         * 獲取當前時間的年月日(無符號),例如:20201228
         */
        DateTimeFormatter dateTimeFormatter5 = DateTimeFormatter.ofPattern("yyyyMMdd");
        String format5 = dateTimeFormatter5.format(LocalDateTime.now());
        System.out.println(format5);

        /**
         * 獲取當前時間三天後的日期,例如:2020-12-31T15:39:37.807
         * 這裡的ChronoUnit.DAYS是時間單位,可以是WEEKS、MONTHS、YEARS
         */
        LocalDateTime plus = LocalDateTime.now().plus(3, ChronoUnit.DAYS);
        System.out.println(plus);

        /**
         * 獲取當前時間三天前的日期,例如:2020-12-25T15:39:37.807
         * 這裡的ChronoUnit.DAYS是時間單位,可以是WEEKS、MONTHS、YEARS
         */
        LocalDateTime plus1 = LocalDateTime.now().minus(3, ChronoUnit.DAYS);
        System.out.println(plus1);

        /**
         * 獲取指定時間當年的最後一天,例如:2020-12-31 23:59:59
         */
        String format6 = dateTimeFormatter1.format(LocalDateTime.now().with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59));
        System.out.println(format6);


        /**
         * 獲取指定時間當年的第一天,例如:2020-01-01 00:00:00
         */
        String format7 = dateTimeFormatter1.format(LocalDateTime.now().with(TemporalAdjusters.firstDayOfYear()).withHour(00).withMinute(00).withSecond(00));
        System.out.println(format7);
        String format8 = dateTimeFormatter1.format(LocalDateTime.now().withDayOfYear(1).withHour(00).withMinute(00).withSecond(00));
        System.out.println(format8);


        /**
         * 獲取指定時間的前三天,例如:2020-12-25
         */
        LocalDate minus = LocalDate.now().minus(3, ChronoUnit.DAYS);
        System.out.println(minus);
        LocalDate localDate = LocalDate.now().minusDays(3);
        System.out.println(localDate);
        LocalDateTime minus1 = LocalDateTime.now().minus(3, ChronoUnit.DAYS);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String format9 = minus1.format(dateTimeFormatter);
        System.out.println(format9);

        /**
         * 獲取指定時間的後三天,例如:2020-12-31
         */
        LocalDate plus2 = LocalDate.now().plus(3, ChronoUnit.DAYS);
        System.out.println(plus2);
        LocalDate localDate1 = LocalDate.now().plusDays(3);
        System.out.println(localDate1);
        LocalDateTime plus3 = LocalDateTime.now().plus(3, ChronoUnit.DAYS);
        DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String format10 = plus3.format(dateTimeFormatter6);
        System.out.println(format10);

    }

}