【Java】Java8新特性之時間和日期API
阿新 • • 發佈:2021-06-22
一、時間和日期API介紹
Java三次引入處理時間的API,JDK1.0中包含了一個Date
類,但大多數方法在java1.1引入Calendear
類之後被棄用了。它的例項都是可變的,而且它的API很難使用,比如月份是從0開始這種反人類的設定。java8引入的java.time 包中
API 已經糾正了之前的問題。它已經完全實現了JSR310
規範。
java8引入了一套全新的時間日期API,本篇隨筆將說明學習java8的這套API。
java.time包中的是類是不可變(類似String類,改變後會新建一個物件)且執行緒安全的。新的時間及日期API位於java.time中,下面是一些關鍵類
●Instant
●LocalDate——不包含具體時間的日期,比如2014-01-14。它可以用來儲存生日,週年紀念日,入職日期等。
●LocalTime——它代表的是不含日期的時間
●LocalDateTime——它包含了日期及時間,不過還是沒有偏移資訊或者說時區。
●ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間為基準的。
二、常用時間日期類介紹
1、Instant 時間戳
1 // Instant:時間戳(以Unix元年:1970年1月1日 00:00:00.000 到某個時間之間的毫秒值) 2 @Test 3 public void test1() {4 // 當前時間戳 5 Instant now = Instant.now(); 6 System.out.println("now = " + now); 7 System.out.println("now.getEpochSecond() = " + now.getEpochSecond()); 8 System.out.println("now.toEpochMilli() = " + now.toEpochMilli()); 9 10 LocalDateTime time = LocalDateTime.of(1970, 1, 1, 0,0);11 System.out.println("time = " + time); 12 Instant instant = time.toInstant(ZoneOffset.UTC); 13 System.out.println("instant = " + instant); 14 System.out.println("instant.toEpochMilli() = " + instant.toEpochMilli()); 15 System.out.println("instant.getEpochSecond() = " + instant.getEpochSecond()); 16 17 Instant instant1 = Instant.ofEpochSecond(60); 18 System.out.println("instant1 = " + instant1); 19 }
2、LocalDate 本地日期
1 @Test 2 public void test1() { 3 // 當前日期 4 LocalDate localDate = LocalDate.now(); 5 System.out.println("localDate = " + localDate); 6 7 LocalDateTime localDateTime = LocalDateTime.now(); 8 System.out.println("localDateTime = " + localDateTime); 9 String s = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); 10 System.out.println("s = " + s); 11 }
3、LocalTime 本地時間
1 @Test 2 public void test1() { 3 // 當前本地時間 4 LocalTime now = LocalTime.now(); 5 System.out.println("now = " + now); 6 7 LocalTime time = LocalTime.of(12, 30, 59); 8 System.out.println("time = " + time); 9 System.out.println("time.getHour() = " + time.getHour()); 10 System.out.println("time.getMinute() = " + time.getMinute()); 11 System.out.println("time.getSecond() = " + time.getSecond()); 12 }
4、LocalDateTime 本地日期時間
1 @Test 2 public void test1() { 3 LocalDate localDate = LocalDate.now(); 4 System.out.println("localDate = " + localDate); 5 6 // 當前本地日期時間 7 LocalDateTime localDateTime = LocalDateTime.now(); 8 System.out.println("localDateTime = " + localDateTime); 9 String s = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); 10 System.out.println("s = " + s); 11 } 12 13 @Test 14 public void test2() { 15 LocalDateTime dateTime = LocalDateTime.of(2024, 12, 4, 8, 9, 14); 16 System.out.println("dateTime = " + dateTime); 17 18 LocalDateTime dateTime1 = dateTime.plusYears(2); 19 System.out.println("dateTime1 = " + dateTime1); 20 21 LocalDateTime dateTime2 = dateTime.minusHours(2); 22 System.out.println("dateTime2 = " + dateTime2); 23 24 System.out.println(dateTime.getYear()); 25 System.out.println(dateTime.getMonth()); 26 System.out.println(dateTime.getDayOfMonth()); 27 System.out.println(dateTime.getHour()); 28 System.out.println(dateTime.getMinute()); 29 System.out.println(dateTime.getSecond()); 30 } 31 32 // Instant:時間戳(以Unix元年:1970年1月1日 00:00:00.000 到某個時間之間的毫秒值) 33 @Test 34 public void test3() { 35 Instant now = Instant.now(); 36 System.out.println("now = " + now); 37 System.out.println("now.getEpochSecond() = " + now.getEpochSecond()); 38 System.out.println("now.toEpochMilli() = " + now.toEpochMilli()); 39 40 LocalDateTime time = LocalDateTime.of(1970, 1, 1, 0,0); 41 System.out.println("time = " + time); 42 Instant instant = time.toInstant(ZoneOffset.UTC); 43 System.out.println("instant = " + instant); 44 System.out.println("instant.toEpochMilli() = " + instant.toEpochMilli()); 45 System.out.println("instant.getEpochSecond() = " + instant.getEpochSecond()); 46 47 Instant instant1 = Instant.ofEpochSecond(60); 48 System.out.println("instant1 = " + instant1); 49 50 }
5、ZonedDateTime時區日期時間
1 @Test 2 public void test1() { 3 ZoneId.getAvailableZoneIds().stream().sorted() 4 .forEach(System.out::println); 5 } 6 7 @Test 8 public void test2() { 9 LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); 10 System.out.println("now = " + now); 11 ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai")); 12 System.out.println("zonedDateTime = " + zonedDateTime); 13 14 }
6、Duration 和Period 時間間隔
Duration:計算兩個“時間”之間的間隔
Period:計算兩個“日期”之間的間隔
1 // Duration:計算兩個“時間”之間的間隔 2 // Period:計算兩個“日期”之間的間隔 3 @Test 4 public void test4() throws InterruptedException { 5 Instant ins1 = Instant.now(); 6 System.out.println("ins1 = " + ins1); 7 Thread.sleep(1234); 8 Instant ins2 = Instant.now(); 9 System.out.println("ins2 = " + ins2); 10 Duration between = Duration.between(ins1, ins2); 11 System.out.println("between = " + between); 12 System.out.println("between.toMillis() = " + between.toMillis()); 13 System.out.println("between.toNanos() = " + between.toNanos()); 14 15 16 17 LocalDateTime localDateTime1 = LocalDateTime.now(); 18 Thread.sleep(1234); 19 LocalDateTime localDateTime2 = LocalDateTime.now(); 20 Duration between1 = Duration.between(localDateTime1, localDateTime2); 21 System.out.println("between1 = " + between1); 22 System.out.println("between1.toMillis() = " + between1.toMillis()); 23 24 } 25 26 @Test 27 public void test5() throws InterruptedException { 28 LocalDate localDate1 = LocalDate.now(); 29 Thread.sleep(1234); 30 LocalDate localDate2 = LocalDate.of(2022,7,30); 31 32 Period between = Period.between(localDate1, localDate2); 33 System.out.println("between = " + between); 34 System.out.println("between.toMillis() = " + between.getDays()); 35 System.out.println("between.getMonths() = " + between.getMonths()); 36 System.out.println("between.getYears() = " + between.getYears()); 37 }
7、DateTimeFormatter 日期時間格式化
1 @Test 2 public void test1() { 3 LocalDateTime now = LocalDateTime.now(); 4 DateTimeFormatter basicIsoDate = DateTimeFormatter.BASIC_ISO_DATE; 5 6 String format1 = now.format(basicIsoDate); 7 System.out.println("format1 = " + format1); 8 9 String format2 = now.format(DateTimeFormatter.ISO_DATE_TIME); 10 System.out.println("format2 = " + format2); 11 12 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 13 String format3 = now.format(dateTimeFormatter); 14 System.out.println("format3 = " + format3); 15 16 LocalDateTime parse = LocalDateTime.parse(format3, dateTimeFormatter); 17 System.out.println("parse = " + parse); 18 }
8、TemporalAdjuster 時間調整器
1 // TemporalAdjuster 時間調整器 2 @Test 3 public void test6() { 4 LocalDateTime dateTime = LocalDateTime.now(); 5 System.out.println("dateTime = " + dateTime); 6 7 LocalDateTime dateTime1 = dateTime.withDayOfMonth(10); 8 System.out.println("dateTime1 = " + dateTime1); 9 10 // 使用時間調整器 11 LocalDateTime dateTime2 = dateTime.with(TemporalAdjusters.firstDayOfMonth()); 12 System.out.println("dateTime2 = " + dateTime2); 13 14 // 自定義時間調整器 15 LocalDateTime dateTime3 = dateTime.with(time -> ((LocalDateTime) time).plusDays(8)); 16 System.out.println("dateTime3 = " + dateTime3); 17 }