- Instant——它代表的是時間戳
- LocalDate——不包含具體時間的日期,比如 2020-01-14。它可以用來存儲生日,周年紀念日,入職日期等。
- LocalTime——它代表的是不含日期的時間
- LocalDateTime——它包含了日期及時間,不過還是沒有偏移信息或者說時區。
- ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以 UTC / 格林威治時間為基準的。
Java 8 是如何處理時間及日期的
示例 1 如何 在 Java 8 中獲取當天的日期
1
2
3
4
5
|
LocalDate today = LocalDate.now(); System.out.println( "Today's Local date : " + today); Output Today's Local date : 2020 - 01 - 14 |
示例 2 如何在 Java 8 中獲取當前的年月日
1
2
3
4
5
6
7
8
9
|
LocalDate today = LocalDate.now(); int year = today.getYear(); int month = today.getMonthValue(); int day = today.getDayOfMonth(); System.out.printf( "Year : %d Month : %d day : %d \t %n" , year, month, day); Output Today's Local date : 2020 - 01 - 14 Year : 2020 Month : 1 day : 14 |
示例 3 在 Java 8 中如何獲取某個特定的日期
1
2
3
4
|
LocalDate dateOfBirth = LocalDate.of( 2010 , 01 , 14 ); System.out.println( "Your Date of birth is : " + dateOfBirth); Output : Your Date of birth is : 2010 - 01 - 14 |
示例 4 在 Java 8 中如何檢查兩個日期是否相等
1
2
3
4
5
6
|
LocalDate date1 = LocalDate.of( 2020 , 01 , 14 ); if (date1.equals(today)){ System.out.printf( "Today %s and date1 %s are same date %n" , today, date1); } Output today 2020 - 01 - 14 and date1 2020 - 01 - 14 are same date |
示例 5 在 Java 8 中如何檢查重復事件,比如說生日
1
2
3
4
5
6
7
8
9
10
|
LocalDate dateOfBirth = LocalDate.of( 2010 , 01 , 14 ); MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth()); MonthDay currentMonthDay = MonthDay.from(today); if (currentMonthDay.equals(birthday)){ System.out.println( "Many Many happy returns of the day !!" ); } else { System.out.println( "Sorry, today is not your birthday" ); } Output: Many Many happy returns of the day !! |
示例 6 如何在 Java 8 中獲取當前時間
1
2
3
4
5
|
LocalTime time = LocalTime.now(); System.out.println( "local time now : " + time); Output local time now : 16 : 33 : 33.369 // in hour, minutes, seconds, nano seconds |
示例 7 如何增加時間里面的小時數
1
2
3
4
5
6
|
LocalTime time = LocalTime.now(); LocalTime newTime = time.plusHours( 2 ); // adding two hours System.out.println( "Time after 2 hours : " + newTime); Output : Time after 2 hours : 18 : 33 : 33.369 |
示例 8 如何獲取 1 周后的日期
1
2
3
4
5
6
7
|
LocalDate nextWeek = today.plus( 1 , ChronoUnit.WEEKS); System.out.println( "Today is : " + today); System.out.println( "Date after 1 week : " + nextWeek); Output: Today is : 2020 - 01 - 14 Date after 1 week : 2020 - 01 - 21 |
示例 9 一年前后的日期
1
2
3
4
5
6
7
8
|
LocalDate previousYear = today.minus( 1 , ChronoUnit.YEARS); System.out.println( "Date before 1 year : " + previousYear); LocalDate nextYear = today.plus( 1 , YEARS); System.out.println( "Date after 1 year : " + nextYear); Output: Date before 1 year : 2019 - 01 - 14 Date after 1 year : 2021 - 01 - 14 |
示例 10 在 Java 8 中使用時鐘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Returns the current time based on your system clock and set to UTC. Clock clock = Clock.systemUTC(); System.out.println( "Clock : " + clock); // Returns time based on system clock zone Clock defaultClock = Clock.systemDefaultZone(); System.out.println( "Clock : " + clock); Output: Clock : SystemClock[Z] Clock : SystemClock[Z] public class MyClass { private Clock clock; // dependency inject ... public void process(LocalDate eventDate) { if (eventDate.isBefore(LocalDate.now(clock)) { ... } } } |
示例 11 在 Java 中如何判斷某個日期是在另一個日期的前面還是后面
1
2
3
4
5
6
7
8
9
10
11
12
|
LocalDate tomorrow = LocalDate.of( 2020 , 1 , 15 ); if (tommorow.isAfter(today)){ System.out.println( "Tomorrow comes after today" ); } LocalDate yesterday = today.minus( 1 , DAYS); if (yesterday.isBefore(today)){ System.out.println( "Yesterday is day before today" ); } Output: Tomorrow comes after today Yesterday is day before today |
示例 12 在 Java 8 中處理不同的時區
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// Date and time with timezone in Java 8 ZoneId america = ZoneId.of("America/New_York"); LocalDateTime localtDateAndTime = LocalDateTime.now(); ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america ); System.out.println( "Current date and time in a particular timezone : " + dateAndTimeInNewYork); Output : Current date and time in a particular timezone : 2020 - 01 -14T16: 33 : 33.373 - 05 : 00 [America/New_York] Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: ASIA/Tokyo at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java: 272 ) at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java: 227 ) at java.time.ZoneRegion.ofId(ZoneRegion.java: 120 ) at java.time.ZoneId.of(ZoneId.java: 403 ) at java.time.ZoneId.of(ZoneId.java: 351 ) |
示例 13 如何表示固定的日期,比如信用卡過期時間
1
2
3
4
5
6
7
8
|
YearMonth currentYearMonth = YearMonth.now(); System.out.printf( "Days in month year %s: %d%n" , currentYearMonth, currentYearMonth.lengthOfMonth()); YearMonth creditCardExpiry = YearMonth.of( 2018 , Month.FEBRUARY); System.out.printf( "Your credit card expires on %s %n" , creditCardExpiry); Output: Days in month year 2020 - 01 : 31 Your credit card expires on 2018 - 02 |
示例 14 如何在 Java 8 中檢查閏年
1
2
3
4
5
6
7
|
if (today.isLeapYear()){ System.out.println( "This year is Leap year" ); } else { System.out.println( "2020 is not a Leap year" ); } Output: 2020 is not a Leap year |
示例 15 兩個日期之間包含多少天,多少個月
1
2
3
4
5
6
|
LocalDate java8Release = LocalDate.of( 2020 , Month.MARCH, 14 ); Period periodToNextJavaRelease = Period.between(today, java8Release); System.out.println( "Months left between today and Java 8 release : " + periodToNextJavaRelease.getMonths() ); Output: Months left between today and Java 8 release : 2 |
示例 16 帶時區偏移量的日期與時間
1
2
3
4
5
6
7
|
LocalDateTime datetime = LocalDateTime.of( 2020 , Month.JANUARY, 14 , 19 , 30 ); ZoneOffset offset = ZoneOffset.of( "+05:30" ); OffsetDateTime date = OffsetDateTime.of(datetime, offset); System.out.println( "Date and Time with timezone offset in Java : " + date); Output : Date and Time with timezone offset in Java : 2020 - 01 -14T19: 30 + 05 : 30 |
示例 17 在 Java 8 中如何獲取當前時間戳
1
2
3
4
5
|
Instant timestamp = Instant.now(); System.out.println( "What is value of this instant " + timestamp); Output : What is value of this instant 2020 - 01 -14T08: 33 : 33 .379Z |
示例 18 如何在 Java 8 中使用預定義的格式器來對日期進行解析 / 格式化
1
2
3
4
5
6
7
|
String dayAfterTommorrow = "20200116" ; LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE); System.out.printf( "Date generated from String %s is %s %n" , dayAfterTommorrow, formatted); Output : Date generated from String 20200116 is 2020 - 01 - 16 |
示例 19 如何在 Java 中使用自定義的格式器來解析日期
1
2
3
4
5
6
7
8
9
10
11
12
|
String goodFriday = "Apr 18 2020" ; try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM dd yyyy" ); LocalDate holiday = LocalDate.parse(goodFriday, formatter); System.out.printf( "Successfully parsed String %s, date is %s%n" , goodFriday, holiday); } catch (DateTimeParseException ex) { System.out.printf( "%s is not parsable!%n" , goodFriday); ex.printStackTrace(); } Output : Successfully parsed String Apr 18 2020 , date is 2020 - 04 - 18 |
示例 20 如何在 Java 8 中對日期進行格式化,轉換成字符串
1
2
3
4
5
6
7
8
9
10
11
|
LocalDateTime arrivalDate = LocalDateTime.now(); try { DateTimeFormatter format = DateTimeFormatter.ofPattern( "MMM dd yyyy hh:mm a" ); String landing = arrivalDate.format(format); System.out.printf( "Arriving at : %s %n" , landing); } catch (DateTimeException ex) { System.out.printf( "%s can't be formatted!%n" , arrivalDate); ex.printStackTrace(); } Output : Arriving at : Jan 14 2020 04 : 33 PM |
示例 21獲取時間戳秒和毫秒
1
2
3
|
Instant ins= Instant.now(); System.out.println( "10位 秒" +ins.getEpochSecond()); System.out.println( "13位 毫秒" +ins.toEpochMilli()); |
Java 8 中日期與時間 API 的幾個關鍵點
- 它提供了 javax.time.ZoneId 用來處理時區。
- 它提供了 LocalDate 與 LocalTime 類
- Java 8 中新的時間與日期 API 中的所有類都是不可變且線程安全的,這與之前的 Date 與 Calendar API 中的恰好相反,那里面像 java.util.Date 以及 SimpleDateFormat 這些關鍵的類都不是線程安全的。
- 新的時間與日期 API 中很重要的一點是它定義清楚了基本的時間與日期的概念,比方說,瞬時時間,持續時間,日期,時間,時區以及時間段。它們都是基于 ISO 日歷體系的。
-
每個 Java 開發人員都應該至少了解這套新的 API 中的這五個類:
- Instant 它代表的是時間戳,比如 2020-01-14T02:20:13.592Z,這可以從 java.time.Clock 類中獲取,像這樣: Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
- LocalDate 它表示的是不帶時間的日期,比如 2020-01-14。它可以用來存儲生日,周年紀念日,入職日期等。
- LocalTime – 它表示的是不帶日期的時間
- LocalDateTime – 它包含了時間與日期,不過沒有帶時區的偏移量
- ZonedDateTime – 這是一個帶時區的完整時間,它根據 UTC / 格林威治時間來進行時區調整
- 這個庫的主包是 java.time,里面包含了代表日期,時間,瞬時以及持續時間的類。它有兩個子 package,一個是 java.time.foramt,這個是什么用途就很明顯了,還有一個是 java.time.temporal,它能從更低層面對各個字段進行訪問。
- 時區指的是地球上共享同一標準時間的地區。每個時區都有一個唯一標識符,同時還有一個地區 / 城市 (Asia/Tokyo) 的格式以及從格林威治時間開始的一個偏移時間。比如說,東京的偏移時間就是 + 09:00。
- OffsetDateTime 類實際上包含了 LocalDateTime 與 ZoneOffset。它用來表示一個包含格林威治時間偏移量(+/- 小時:分,比如 + 06:00 或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒)。
- DateTimeFormatter 類用于在 Java 中進行日期的格式化與解析。與 SimpleDateFormat 不同,它是不可變且線程安全的,如果需要的話,可以賦值給一個靜態變量。DateTimeFormatter 類提供了許多預定義的格式器,你也可以自定義自己想要的格式。當然了,根據約定,它還有一個 parse() 方法是用于將字符串轉換成日期的,如果轉換期間出現任何錯誤,它會拋出 DateTimeParseException 異常。類似的,DateFormatter 類也有一個用于格式化日期的 format() 方法,它出錯的話則會拋出 DateTimeException 異常。
- 再說一句,“MMM d yyyy”與 “MMm dd yyyy” 這兩個日期格式也略有不同,前者能識別出”Jan 2 2020″與”Jan 14 2020″這兩個串,而后者如果傳進來的是”Jan 2 2020″則會報錯,因為它期望月份處傳進來的是兩個字符。為了解決這個問題,在天為個位數的情況下,你得在前面補 0,比如”Jan 2 2020″應該改為”Jan 02 2020″。
總結
到此這篇關于Java 8新時間日期庫java.time使用的文章就介紹到這了,更多相關Java 8新時間日期庫java.time內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://rumenz.com/rumenbiji/java8-java-time.html