傳統的時間 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 }