java8新特性——時間日期API

  傳統的時間 API 存在線程安全的問題,在多線程開發中必需要上鎖,因此 java8 如今爲咱們提供了一套全新的時間日期 API ,今天進來學習一下java8 的時間日期 API。java

 

1、使用 LocalDate、LocalTime、LocalDateTime安全

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

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

  下面就以LocalDateTime做爲例子進行示範:學習

    1.獲取當前時間spa

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.對時間進行加減操做code

 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     }

  對舊的時間進行操做以後返回一個新的時間。orm

    

    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     }

 

2、使用 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     }

 

3、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     }

 

 

4、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     }

 

5、時間校訂器

   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     }

 

 6、時間、日期格式化 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     }
相關文章
相關標籤/搜索