java8新特性——時間日期API


  傳統的時間 API 存在線程安全的問題,在多線程開發中必須要上鎖,所以 java8 現在為我們提供了一套全新的時間日期 API ,今天進來學習一下java8 的時間日期 API。

 

一、使用 LocalDate、LocalTime、LocalDateTime

  LocalDate、LocalTime、LocalDateTime類的實例是不可變的對象,分別表示使用 ISO-8601 (ISO-8601 日歷系統是國際化組織制定的現代化公民的日期和時間的表達法)日歷系統的日期、時間、日期和時間。它們提供了簡單的日期或時間,並不包含當前時間的時間信息。也不包含與時區相關的信息。

  LocalDate LocalTime LocalDateTime 三個類的使用方式一樣,只是代表的不同而已。

  下面就以LocalDateTime作為例子進行示范:

    1.獲取當前時間

1     /**
2      * 獲取當前時間
3      */
4     @Test
5     public void test1() {
6         LocalDateTime now = LocalDateTime.now();
7     }

    

    2.獲取指定時間日期

1     /**
2      * 獲取指定時間日期
3      */
4     @Test
5     public void test2() {
6         LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
7     }

   

    3.對時間進行加減操作

 1     /**
 2      * 對時間進行加減操作
 3      */
 4     @Test
 5     public void test3() {
 6         LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
 7         //加時間
 8         LocalDateTime time1 = now.plusYears(1).plusMonths(2).
 9                 plusDays(3).plusHours(5).plusMinutes(45).
10                 plusSeconds(32);
11         //剪時間
12         LocalDateTime time2 = now.minusYears(1).minusMonths(2).
13                 minusDays(3).minusHours(5).minusMinutes(45).
14                 minusSeconds(32);
15     }

  對舊的時間進行操作之后返回一個新的時間。

    

    4. 獲取獲取時間的年、月、日

 1     /**
 2      * 獲取時間的年、月、日
 3      */
 4     @Test
 5     public void test4() {
 6         LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
 7         //獲取年
 8         int year = now.getYear();
 9         //獲取月
10         Month month = now.getMonth();
11         //獲取月的value值
12         int monthValue = now.getMonthValue();
13         //獲取在本月的第幾天(日)
14         int dayOfMonth = now.getDayOfMonth();
15         //獲取在本年的第幾天
16         int dayOfYear = now.getDayOfYear();
17         //獲取在本周的第幾天(星期幾)
18         DayOfWeek dayOfWeek = now.getDayOfWeek();
19         //獲取小時
20         int hour = now.getHour();
21         //獲取分鍾
22         int minute = now.getMinute();
23         //獲取秒
24         int second = now.getSecond();
25         //獲取納秒
26         int nano = now.getNano();27     }

 

二、使用 Instant : 時間戳(以Unix 元年 : 1970-01-01 00:00:00 到某個時間之間的毫秒數)

  1. 獲取系統當前時間

1     /**
2      * 獲取當前時間 默認獲取 UTC 時區
3      */
4     @Test
5     public void test5() {
6         Instant now = Instant.now();
7     }

  上面時間默認獲取到的是 UTC 時區的時間,與中國時間相差8小時,我們可以給它設置偏移量。

1     /**
2      * 獲取中國當前時間
3      */
4     @Test
5     public void test6() {
6         Instant now = Instant.now().
7                 atOffset(ZoneOffset.ofHours(8)).toInstant();
8     }

 

  2. 獲取當前時間的時間戳

1     /**
2      * 獲取中國當前時間戳
3      */
4     @Test
5     public void test7() {
6         long now = Instant.now().
7                 atOffset(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
8     }

 

三、Duration 計算兩個時間之間的間隔

 1     /**
 2      * 獲取兩個時間之間的間隔
 3      */
 4     @Test
 5     public void test8() {
 6         Instant now1 = Instant.now();
 7         Instant now2 = Instant.now().
 8                 atOffset(ZoneOffset.ofHours(8)).toInstant();
 9         Duration.between(now1, now2);
10         
11         LocalDateTime now3 = LocalDateTime.now();
12         LocalDateTime now4 = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
13         
14         Duration.between(now3, now4);
15     }

 

 

四、Period 計算兩個日期之間的間隔

 1     /**
 2      * 獲取兩個日期之間的間隔
 3      */
 4     @Test
 5     public void test9() {
 6         LocalDate now1 = LocalDate.now();
 7         LocalDate now2 = LocalDate.of(2018, 6, 10);
 8         
 9         Period.between(now1, now2);
10     }

 

五、時間校正器

   TemporalAdjuster:時間矯正器。有時我們可能需要獲取一個周末,或者下一個工作日等時間,這里 java8 就為我們提供了一個時間校正器,讓我們對時間進行校准。

  TemporalAdjusters:該類通過靜態方法提供了大量的常用的TemporalAdjuster的實現供我們使用。

  在localDateTime中,有一個with方法,其中可以讓我們去寫一TemporalAdjuster接口,而TemporalAdjusters類中,有許多常用的方法,下面就來看看:

 1     /**
 2      * 時間校正器TemporalAdjuster
 3      */
 4     @Test
 5     public void test10() {
 6         LocalDateTime now1 = LocalDateTime.now();
 7         //獲取月中 第一天
 8         now1.with(TemporalAdjusters.firstDayOfMonth());
 9         //獲取下一年的第一天
10         now1.with(TemporalAdjusters.firstDayOfNextYear());
11         //獲取年中第一天
12         now1.with(TemporalAdjusters.lastDayOfYear());
13         //獲取月中最后一天
14         now1.with(TemporalAdjusters.lastDayOfMonth());
15         //獲取下個星期一
16         now1.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
17         //自定時時間:下一個工作日,因為這里需要一個接口,所以完全可以自定義方法
18         now1.with((e) -> {
19             LocalDateTime now = (LocalDateTime)e; 
20             DayOfWeek dow = now.getDayOfWeek();
21             if (dow.equals(DayOfWeek.FRIDAY)) 
22                 return now.plusDays(3);
23             else if (dow.equals(DayOfWeek.SATURDAY))
24                 return now.plusDays(2);
25             return  now.plusDays(1);
26         });
27     }

 

 六、時間、日期格式化 DateTimeFormatter

   1. 時間轉字符串

    在 DateTimeFormatter 中為我們提供了一下多種格式轉換方式,我們可以去選擇使用。

 1     /**
 2      * The printer and/or parser to use, not null.
 3      */
 4     private final CompositePrinterParser printerParser;
 5     /**
 6      * The locale to use for formatting, not null.
 7      */
 8     private final Locale locale;
 9     /**
10      * The symbols to use for formatting, not null.
11      */
12     private final DecimalStyle decimalStyle;
13     /**
14      * The resolver style to use, not null.
15      */
16     private final ResolverStyle resolverStyle;
17     /**
18      * The fields to use in resolving, null for all fields.
19      */
20     private final Set<TemporalField> resolverFields;
21     /**
22      * The chronology to use for formatting, null for no override.
23      */
24     private final Chronology chrono;
25     /**
26      * The zone to use for formatting, null for no override.
27      */
28     private final ZoneId zone;

 

     當然,我們也可以自定義時間格式,進行轉換。

1     /*
2      * 將時間轉換為字符串
3      */
4     @Test
5     public void test11() {
6         LocalDate now = LocalDate.now();
7         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss");
8         now.format(dtf);
9     }

 

  2.將字符串轉換為時間

1     /*
2      * 將字符串轉換為時間
3      */
4     @Test
5     public void test12() {
6         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss");
7         LocalDateTime.parse("2018-06-18 21:45:23", dtf);
8     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM