1. 程式人生 > WINDOWS開發 >JDK8中新日期時間API

JDK8中新日期時間API

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);
	}