一、Date類
(一)、ZoneId:時區
1、概述
????????ZoneId是Java 8中處理時區的類。它用于表示時區標識符,例如“America/New_York”或“Asia/Tokyo”。一共有600個時區。
2、常用方法:
static Set<String> getAvailableZoneIds() | 獲取Java中支持的所有時區 |
static ZoneId systemDefault() | 獲取系統默認時區 |
static ZoneId of(String zoneId) | 獲取一個指定的時區 |
// 獲取Java中支持的所有時區
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);// 獲取系統默認時區
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId);// 獲取一個指定的時區
ZoneId zoneId1 = ZoneId.of("Asia/Pontianak");
System.out.println(zoneId1);
(二)、Instant:時間戳
1、概述
????????Instant是Java 8中新添加的類,用于表示時間戳。它是一個包含秒數和納秒數的不可變對象,可以精確到納秒級別。
2、常用方法:
static Instant now() | 獲取當前時間的Instant對象(標準時間) |
static Instant ofXXX(long epochMilli) | 根據(秒/毫秒/納秒)獲取Instant對象 |
ZoneDateTime atZone(ZoneId zone) | 指定時區 |
boolean isXXX(Instant otherInstant) | 判斷系列的方法 |
Instant minusXXX(long millisToSubtract) | 減少時間系列的方法 |
Instant plusXXX(long millisToSubtract) | 增加時間系列的方法 |
// 獲取當前時間的Instant對象(標準時間)
Instant now = Instant.now();
System.out.println(now);// 根據(秒/毫秒/納秒)獲取Instant對象
Instant instant = Instant.ofEpochMilli(0L);
System.out.println(instant);Instant instant1 = Instant.ofEpochSecond(1L);
System.out.println(instant1);Instant instant2 = Instant.ofEpochSecond(1L, 1000000000L);
System.out.println(instant2);// 指定時區
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);// 判斷系列的方法
Instant instant3 = Instant.ofEpochMilli(0L);
Instant instant4 = Instant.ofEpochMilli(1000L);System.out.println(instant3.isBefore(instant4));
System.out.println(instant3.isAfter(instant4));// 減少時間系列的方法
Instant instant5 = Instant.ofEpochMilli(3000L);
System.out.println(instant5);Instant instant6 = instant5.minusSeconds(1);
System.out.println(instant6);// 增加時間系列的方法
Instant instant7 = Instant.ofEpochMilli(0L);
System.out.println(instant7);Instant instant8 = instant7.plusSeconds(10);
System.out.println(instant8);
(三)、ZoneDateTime:帶時區的時間
1、概述
????????ZoneDateTime是Java 8中的日期時間類,表示帶有時區偏移量的日期時間信息。它是LocalDateTime類和ZoneId類的結合,同時包含了時區信息和本地日期時間。它可以用來表示任意時區中的日期時間信息,并且可以方便地進行時區之間的轉換。
2、常用方法:
now():返回當前時區的當前時間。
of():根據指定的年、月、日、小時、分鐘、秒和時區創建一個 ZonedDateTime 對象。
toInstant():將 ZonedDateTime 對象轉換為 Instant 對象,即從時區時間轉為標準時間。
withZoneSameInstant():根據指定時區,將 ZonedDateTime 對象轉換為同一時刻的另一個時區時間。
withZoneSameLocal():根據指定時區,將 ZonedDateTime 對象轉換為同一本地時間的另一個時區時間。
toLocalDateTime():將 ZonedDateTime 對象轉換為 LocalDateTime 對象,即去掉時區信息。
format():格式化 ZonedDateTime 對象為指定格式的時間字符串。
getYear():獲取年份。
getMonth():獲取月份。
getDayOfMonth():獲取日期。
getDayOfWeek():獲取星期幾。
getHour():獲取小時。
getMinute():獲取分鐘。
getSecond():獲取秒數。
getNano():獲取納秒數。
二、日期格式化類
(一)、DateTimeFormatter:用于時間的格式化和解析
1、概述
????????DateTimeFormatter是Java 8中的一個類,用于格式化日期和時間。它可以將日期和時間對象轉換為指定格式的字符串,也可以將字符串轉換為日期和時間對象。
2、常用方法:
static DateTimeFormatter ofPattern(格式) | 獲取格式對象 |
String format(時間對象) | 按照指定方式格式化 |
// 獲取格式對象
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));// 解析/格式化器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");// 格式化
System.out.println(dateTimeFormatter.format(zonedDateTime));
三、日歷類
(一)、LocalDate:年、月、日? ?
??????????????LocalTime:時、分、秒? ?
??????????????LocalDateTime:年、月、日、時、分、秒
1、概述
????????Java中的LocalDate是一個不可變的日期對象,代表了一個年月日的日期,不包含時間和時區信息。它是Java 8 API中的一部分,位于java.time包中。
????????LocalDate類提供了許多方便的方法來處理日期、時間和時間間隔,例如加減天數、月份、年份、與其他日期比較等。它支持ISO日歷系統(也就是公歷)。
????????LocalTime是Java 8中的時間API中的一種類型。它代表的是一個不帶時區的時間,即僅表示時間部分,如小時、分鐘、秒和毫秒。
????????Java中的LocalDateTime是一個表示日期和時間,但沒有時區偏移的類。它可以用于存儲日期和時間的信息,例如:2021年8月15日下午3點30分。它不包含時區信息,所以它無法表示特定時區的時間。
2、常用方法:
static XXX now() | 獲取當前時間的對象 |
static XXX of(...) | 獲取指定時間的對象 |
get開頭的方法 | 獲取日歷中的年,月,日,時,分,秒等信息 |
isBefore,isAfter | 比較兩個LocalDate |
with開頭 | 修改時間 |
minus開頭 | 減少時間 |
plus開頭 | 增加時間 |
public LocalDate toLocalDate() | LocalDateTiem轉換成一個LocaDate對象 |
public LocalTime toLocalTime() | LocalDateTiem轉換成一個LocaTime對象 |
// 只演示LocalDate
// 獲取當前時間的對象
LocalDate date = LocalDate.now();
System.out.println(date); // 2023-12-12// 獲取指定時間的對象
LocalDate localDate = LocalDate.of(2023, 1, 1);
System.out.println(localDate); // 2023-01-01// 獲取日歷中的年,月,日,時,分,秒等信息
int year = localDate.getYear();
System.out.println(year);// 2023// 獲取月
Month m = localDate.getMonth();
System.out.println(m); // JANUARY
System.out.println(m.getValue()); // 1int value = localDate.getMonthValue();
System.out.println(value);// 1// 比較兩個LocalDate
System.out.println(localDate.isBefore(localDate));
System.out.println(localDate.isAfter(localDate));// 修改時間
LocalDate withYear = localDate.withYear(2000);
System.out.println(withYear); // 2000-01-01// 減少時間
LocalDate minusYears = localDate.minusYears(1);
System.out.println(minusYears); // 2022-01-01// 增加時間
LocalDate plusYears = localDate.plusYears(1);
System.out.println(plusYears); // 2024-01-01
四、工具類
(一)、Duration:時間間隔(秒,納秒)
1、概述
Java中的Duration是一個類,用于表示時間段的長度,以時間的標準單位表示,如小時、分鐘、秒、毫秒等。它可以用于計算時間間隔,比較時間間隔的大小,以及在時間上進行加減運算等。
2、常用方法:
- ofXXX()方法:根據不同的單位創建Duration對象。
- plusXXX()方法和minusXXX()方法:用于添加和減去時間間隔。
- toXXX()方法:將Duration對象轉換為指定單位的時間間隔。
- compareTo()方法:比較兩個Duration對象的大小。
- getXXX()方法:獲取Duration對象的屬性值,例如hours、minutes、seconds等
Duration duration1 = Duration.ofSeconds(60); // 創建一個持續時間為60秒的Duration對象
Duration duration2 = Duration.ofMinutes(5); // 創建一個持續時間為5分鐘的Duration對象Duration duration3 = Duration.ofSeconds(30);
Duration duration4 = duration3.plusSeconds(10); // 將持續時間增加10秒
Duration duration5 = duration3.minusSeconds(10); // 將持續時間減少10秒Duration duration6 = Duration.ofMinutes(5);
long seconds = duration6.toSeconds(); // 將持續時間轉換為秒數Duration duration7 = Duration.ofSeconds(60);
Duration duration8 = Duration.ofMinutes(1);
int result = duration7.compareTo(duration8); // 比較持續時間是否相等Duration duration9 = Duration.ofHours(2);
long hours = duration9.toHours(); // 獲取持續時間的小時數
(二)、Period:時間間隔(年,月,日)
1、概述
????????Java中的Period是表示兩個日期之間的一段時間的類。它包含年、月、日等字段,可以用于計算兩個日期之間的差值,也可以用于將一段時間加到日期上。Period類主要用于處理調整日期的情況,例如加上一個月、減去一年等。
2、常用方法:
- ofYears(int years): 創建一個表示指定年數的Period對象。
- ofMonths(int months): 創建一個表示指定月數的Period對象。
- ofDays(int days): 創建一個表示指定天數的Period對象。
- between(LocalDate startDateInclusive, LocalDate endDateExclusive): 創建一個表示兩個日期之間的Period對象。
- getYears(), getMonths(), getDays(): 獲取Period對象中的年、月、日等字段的值。
- plusYears(long yearsToAdd), plusMonths(long monthsToAdd), plusDays(long daysToAdd): 將指定的年、月、日數加到Period對象上。
- minusYears(long yearsToSubtract), minusMonths(long monthsToSubtract), minusDays(long daysToSubtract): 將指定的年、月、日數從Period對象上減去。
// 創建Period對象
Period period = Period.between(LocalDate.of(2019, 1, 1), LocalDate.now());
System.out.println(period.getYears() + " years " + period.getMonths() + " months " + period.getDays() + " days");// 在日期上加上一段時間
LocalDate date = LocalDate.of(2022, 1, 1);
Period nextYear = Period.ofYears(1);
LocalDate nextDate = date.plus(nextYear);
System.out.println("Next year is " + nextDate);
(三)、ChronoUnit:時間間隔(所有單位)
1、概述
????????ChronoUnit是Java 8中java.time包中的一個枚舉類,表示一種時間單位。它提供了一組時間單位常量,用于在LocalDate、LocalTime、LocalDateTime和ZonedDateTime中執行日期或時間計算。
ChronoUnit中的常量包括:
- NANOS:納秒
- MICROS:微秒
- MILLIS:毫秒
- SECONDS:秒
- MINUTES:分鐘
- HOURS:小時
- HALF_DAYS:半天
- DAYS:天
- WEEKS:周
- MONTHS:月
- YEARS:年
- DECADES:十年
- CENTURIES:世紀
- MILLENNIA:千年
- ERAS:時代
2、常用方法:
between
方法:計算兩個日期或時間之間的差距,返回值為long類型。addTo
方法:將指定的時間段添加到日期或時間中。isSupportedBy
方法:判斷指定的日期或時間是否支持指定的時間單位。getDuration
方法:獲取指定時間單位的持續時間。valueOf
方法:根據字符串返回對應的ChronoUnit枚舉常量。
LocalDate d1 = LocalDate.of(2022, 1, 1);
LocalDate d2 = LocalDate.of(2022, 1, 10);
long daysBetween = ChronoUnit.DAYS.between(d1, d2);
System.out.println("daysBetween: " + daysBetween); // 輸出:9LocalDate date = LocalDate.of(2022, 1, 1);
LocalDate newDate = date.plus(1, ChronoUnit.WEEKS);
System.out.println("newDate: " + newDate); // 輸出:2022-01-08LocalDate date = LocalDate.of(2022, 1, 1);
boolean isSupported = ChronoUnit.HOURS.isSupportedBy(date);
System.out.println("isSupported: " + isSupported); // 輸出:falseDuration dayDuration = ChronoUnit.DAYS.getDuration();
System.out.println("dayDuration: " + dayDuration); // 輸出:PT24HChronoUnit unit = ChronoUnit.valueOf("MONTHS");
System.out.println("unit: " + unit); // 輸出:MONTHS