1. 程式人生 > 其它 >【Java】Java8新特性之時間和日期API

【Java】Java8新特性之時間和日期API

一、時間和日期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 }