Java 8之前的庫對時間和日期的支援非常不理想,不用擔心,在Java 8中引入全新的時間和日期API,並且都是執行緒安全的
-
新時間日期API常用物件介紹
LocalDate: 表示沒有時區的日期, LocalDate是不可變且執行緒安全
LocalTime: 表示沒有時區的時間, LocalTime是不可變且執行緒安全
LocalDateTime: 表示沒有時區的日期時間, LocalDateTime是不可變且執行緒安全
ZoneId: 時區ID,用來確定Instant和LocalDateTime互相轉換的規則
Instant: 用來表示時間線上的一個點(瞬時/時間戳)
Clock: 用於訪問當前時刻、日期、時間,用到時區
Duration: 用秒和納秒錶示時間的數量(長短),用於計算兩個日期的“時間”間隔
Period: 用於計算兩個“日期”間隔
其中,LocalDate、LocalTime、LocalDateTime是新API裡的基礎物件:
LocalDate : 只含年月日的日期物件
LocalTime :只含時分秒的時間物件
LocalDateTime : 同時含有年月日時分秒的日期物件
-
新時間日期API示例
(1)獲取當前時間:
- now() : 靜態方法,根據當前時間建立物件
LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDate); System.out.println(localTime); System.out.println(localDateTime); /* 輸出: 2019-02-23 19:23:10.865021300 2019-02-23T19:23:10.866021400 */
(2)獲取當前年、月、日
LocalDate today = LocalDate.now(); int year = today.getYear(); int month = today.getMonthValue(); int day = today.getDayOfMonth(); System.out.println("年:"+year+" 月:"+month+" 日:"+day); /* 輸出: 年:2019 月:2 日:23 */
(3)根據指定日期時間建立物件
– of() : 靜態方法 並返回一個LocalDate例項
LocalDate localDate = LocalDate.of(2019, 2, 23); LocalTime localTime = LocalTime.of(9, 43, 20); LocalDateTime localDateTime = LocalDateTime.of(2019, 2, 23, 9, 43, 20); System.out.println(localDate); System.out.println(localTime); System.out.println(localDateTime); /* 輸出: 2019-02-23 9:43:20 2019-02-23T9:43:20 */
(4)檢查兩個日期是否相等
LocalDate重寫了equals方法來進行日期的比較
LocalDate today = LocalDate.now(); LocalDate day = LocalDate.of(2019, 2, 14); System.out.println("今天的日期是2019-02-14麼?"+today.equals(day)); // 今天的日期是2019-02-14麼?false
(5)判斷是否閏年
LocalDate now = LocalDate.now(); System.out.println( now + "是否是閏年" + now.isLeapYear()); // 2019-02-23 是否是閏年 false
(6)獲取當前時間戳
Instant類由一個靜態的工廠方法now()可以返回當前時間戳
Instant instant = Instant.now(); System.out.println(instant); // 2019-02-23T12:19:53.455638400Z
可以使用這個兩個類中的方法在這兩個型別之間進行轉換
- Date.from(Instant)就是用來把Instant轉換成java.util.date
- Date.toInstant()就是將Date轉換成Instant
以上獲取到的是 UTC 時區的時間,與中國時間相差8小時,可以設定偏移量
Instant instant = Instant.now(); System.out.println(instant.atOffset(ZoneOffset.ofHours(8))); // 中國當前時間:2019-02-23T20:37:26.980896600+08:00
(7)兩個日期之間相差多少時間
LocalDate today = LocalDate.now(); LocalDate day = LocalDate.of(2018, 2, 14); Period period = Period.between(day, today); System.out.println(period.getYears()+"-"+period.getMonths()+"-"+period.getDays()); // 兩者 相差 1年-0月-9天
(8)獲取這個年中月有多少天
用於檢查2月是否潤2
YearMonth yMonth = YearMonth.now(); System.out.println("這個"+yMonth+"年月有"+yMonth.lengthOfMonth()+"天"); // 這個2019-02年月有28天
(9)使用時鐘
獲取某個時區下當前的瞬時時間、日期,代替System.currentTimelnMillis()與TimeZone.getDefault()方法
Clock clock = Clock.systemUTC(); System.out.println(clock); // SystemClock[Z] Clock.systemDefaultZone(); System.out.println(clock); // SystemClock[Z]
(10)判斷某個日期在另一個日期的之前/之後
LocalDate today = LocalDate.now(); LocalDate tommorow = today.plus(1,ChronoUnit.DAYS); System.out.println("明天的日期:"+tommorow); System.out.println("日期:"+tommorow+"是否在日期:"+today+"之後:"+tommorow.isAfter(today)); System.out.println("日期:"+tommorow+"是否在日期:"+today+"之後:"+tommorow.isBefore(today)); //今天的日期:2019-02-23 //明天的日期:2019-02-24 //日期:2019-02-24是否在日期:2019-02-23之後:true //日期:2019-02-24是否在日期:2019-02-23之後:false
(11)時間/日期的修改
LocalDate nowDate = LocalDate.now(); System.out.println(nowDate.minusYears(1));//一年前 System.out.println(nowDate.minusMonths(1));//一月前 System.out.println(nowDate.minusWeeks(1));//一週前 System.out.println(nowDate.minusDays(1));//一天前 System.out.println(nowDate.plusYears(1));//一年後 System.out.println(nowDate.plusMonths(1));//一月後 System.out.println(nowDate.plusWeeks(1));//一週後 System.out.println(nowDate.plusDays(1));//一天後
LocalTime nowTime = LocalTime.now(); System.out.println(nowTime.minusHours(1));//一小時前 System.out.println(nowTime.minusMinutes(1));//一分鐘前 System.out.println(nowTime.minusSeconds(1));//一秒前 System.out.println(nowTime.minusNanos(1));//一納秒前 System.out.println(nowTime.plusHours(1));//一小時後 System.out.println(nowTime.plusMinutes(1));//一分鐘後 System.out.println(nowTime.plusSeconds(1));//一秒後 System.out.println(nowTime.plusNanos(1));//一納秒後
(12)時間日期格式化
LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt);//2018-09-06T18:22:47.366 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String ldtStr = ldt.format(dtf); System.out.println(ldtStr);//2018-09-06 18:22:47 String ldtStr1 = dtf.format(ldt); System.out.println(ldtStr1);//2018-09-06 18:22:47
預定義的格式器來對日期進行解析/格式化:
String temp = "20190214"; LocalDate formatted = LocalDate.parse(temp,DateTimeFormatter.BASIC_ISO_DATE); System.out.println("格式化後的格式是:"+formatted); // 格式化後的格式是:2019-02-14
自定義解析為日期:
String str = "01 12 2014"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy"); LocalDate lDate = LocalDate.parse(str,formatter); System.out.println("格式化後的格式是:"+lDate); // 格式化後的格式是:2014-01-12
日期進行格式化,轉換成字串:
LocalDateTime lDateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy HH:mm a"); String str = localDateTime.format(formatter); System.out.println("格式化後的格式是:"+str); // 2019-02-23T9:45:20 格式化後的格式是:02 23 2019 22:37 下午
OffsetDateTime類實際上包含了LocalDateTime與ZoneOffset。它用來表示一個包含格林威治時間偏移量(+/-小時:分,比如+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒)
“MMM d yyyy”與“MMm dd yyyy”這兩個日期格式也略有不同,前者能識別出”Jan 2 2019″與”Jan 14 2019″這兩個串,而後者如果傳進來的是”Jan 2 2014″則會報錯,因為它期望月份處傳進來的是兩個字元。為了解決這個問題,在天為個位數的情況下,你得在前面補0,比如”Jan 2 2019″應該改為”Jan 02 2019″
DateTimeFormatter類用於在Java中進行日期的格式化與解析。與SimpleDateFormat不同,它是不可變且執行緒安全的
時區指的是地球上共享同一標準時間的地區。每個時區都有一個唯一識別符號,同時還有一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間。比如說,東京的偏移時間就是+09:00