JDK8中新日期時間API
阿新 • • 發佈:2020-06-21
0 本文目錄
目錄
1.日期時間API的迭代:
第一代:jdk 1.0 Date類
第二代:jdk 1.1 Calendar類,一定程度上替換Date類
第三代:jdk 1.8 提出了新的一套API
2.前兩代存在的問題舉例:
可變性:像日期和時間這樣的類應該是不可變的。
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
格式化:格式化只對Date用,Calendar則不行。
此外,它們也不是執行緒安全的;不能處理閏秒等
3.java 8 中新的日期時間API涉及到的包
4.本地日期、本地時間、本地日期時間的使用:LocalDate / LocalTime / LocalDateTime
4.1 說明:
① 分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間資訊,也不包含與時區相關的資訊。
② LocalDateTime相較於LocalDate、LocalTime,使用頻率要高
③ 類似於Calendar
4.2 常用方法:
5.時間點:Instant
5.1 說明:
① 時間線上的一個瞬時點。 概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC開始的秒數。)
② 類似於 java.util.Date類
5.2 常用方法:
6.日期時間格式化類:DateTimeFormatter
6.1 說明:
① 格式化或解析日期、時間
② 類似於SimpleDateFormat
6.2 常用方法:
① 例項化方式:
預定義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相關的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
② 常用方法:
特別的:自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
// 重點:自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);
7.其它API的使用 (看API說明,相對來說不那麼重要)
7.1 帶時區的日期時間:ZonedDateTime / ZoneId
舉例:
// ZoneId:類中包含了所的時區資訊
@Test
public void test1(){
//getAvailableZoneIds():獲取所的ZoneId
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
for(String s : zoneIds){
System.out.println(s);
}
System.out.println();
//獲取“Asia/Tokyo”時區對應的時間
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(localDateTime);
}
//ZonedDateTime:帶時區的日期時間
@Test
public void test2(){
//now():獲取本時區的ZonedDateTime物件
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
//now(ZoneId id):獲取指定時區的ZonedDateTime物件
ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(zonedDateTime1);
}
7.2 時間間隔:Duration--用於計算兩個“時間”間隔,以秒和納秒為基準
舉例:
@Test
public void test3(){
LocalTime localTime = LocalTime.now();
LocalTime localTime1 = LocalTime.of(15,23,32);
//between():靜態方法,返回Duration物件,表示兩個時間的間隔
Duration duration = Duration.between(localTime1,localTime);
System.out.println(duration);
System.out.println(duration.getSeconds());
System.out.println(duration.getNano());
LocalDateTime localDateTime = LocalDateTime.of(2016,6,12,15,32);
LocalDateTime localDateTime1 = LocalDateTime.of(2017,32);
Duration duration1 = Duration.between(localDateTime1,localDateTime);
System.out.println(duration1.toDays());
}
7.3 日期間隔:Period --用於計算兩個“日期”間隔,以年、月、日衡量
舉例:
@Test
public void test4(){
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.of(2028,3,18);
Period period = Period.between(localDate,localDate1);
System.out.println(period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
Period period1 = period.withYears(2);
System.out.println(period1);
}
7.4 日期時間校正器:TemporalAdjuster
舉例:
@Test
public void test5(){
//獲取當前日期的下一個週日是哪天?
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
System.out.println(localDateTime);
//獲取下一個工作日是哪天?
LocalDate localDate = LocalDate.now().with(new TemporalAdjuster(){
@Override
public Temporal adjustInto(Temporal temporal) {
LocalDate date = (LocalDate)temporal;
if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
return date.plusDays(3);
}else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
return date.plusDays(2);
}else{
return date.plusDays(1);
}
}
});
System.out.println("下一個工作日是:" + localDate);
}