Java8新特性之新的日期和時間API

使用LocalDate、LocalTime、LocalDateTime

          LocalDate、LocalTime、LocalDateTime 類的實例是不可變的對象,分別表示使用ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的日期或時間,並不包含當前的時間信息。也不包含與時區相關的信息。java

注:ISO-8601日曆系統是國際標準化組織制定的現代公民的日期和時間的表示法ui

//1.LocalDate、LocalTime、LocalDateTime
	@Test
	public void test1(){
		//獲取當前時間
		LocalDateTime ldt = LocalDateTime.now();
		System.out.println(ldt);//2017-03-13T15:52:41.810
		//指定日期實例
		LocalDateTime ldt2 = LocalDateTime.of(2016, 5, 22, 14, 20, 22);
		System.out.println(ldt2);//2016-05-22T14:20:22
		//加一年
		LocalDateTime ldt3 = ldt.plusYears(1L);
		System.out.println(ldt3);//2018-03-13T15:53:51.812
		//分別去年月日時分秒
		System.out.println(ldt.getYear());//2017
		System.out.println(ldt.getMonthValue());//3
		System.out.println(ldt.getDayOfMonth());//13
		System.out.println(ldt.getHour());//15
		System.out.println(ldt.getMinute());//56
		System.out.println(ldt.getSecond());//22
	}

Instant 時間戳

   用於「時間戳」的運算。它是以Unix元年(傳統的設定爲UTC時區1970年1月1日午夜時分)開始所經歷的描述進行運算spa

//2.Instant 時間戳
	@Test
	public void test2(){
		Instant in = Instant.now();//默認獲取UTC時區時間(格林威治時間),與中國時間差8小時
		System.out.println(in);//2017-03-13T08:04:57.942Z
		OffsetDateTime offsetDateTime = in.atOffset(ZoneOffset.ofHours(8));
		System.out.println(offsetDateTime);//2017-03-13T16:04:57.942+08:00
		//獲取時間戳
		System.out.println(in.toEpochMilli());//1489392373689
		//對UTC元年的計算
		Instant newIn = Instant.ofEpochSecond(60);
		System.out.println(newIn);//1970-01-01T00:01:00Z
	}

Duration 和Period

  • Duration:用於計算兩個「時間」間隔
  • Period:用於計算兩個「日期」間隔
    //3.Duration 和Period
    	/*Duration:用於計算兩個「時間」間隔
    	Period:用於計算兩個「日期」間隔*/
    	@Test
    	public void test3() throws InterruptedException {
    		//Duration:用於計算兩個「時間」間隔
    		Instant in1 = Instant.now();
    		Thread.sleep(1000);
    		Instant in2 = Instant.now();
    		Duration d = Duration.between(in1, in2);
    		System.out.println(d.toMillis());//1000
    
    		System.out.println("-------------");
    
    		LocalDateTime ldt1 = LocalDateTime.now();
    		Thread.sleep(2000);
    		LocalDateTime ldt2 = LocalDateTime.now();
    		Duration d2 = Duration.between(ldt1, ldt2);
    		System.out.println(d2.toMillis());//2000
    
    		//Period:用於計算兩個「日期」間隔
    		LocalDate ld = LocalDate.of(2015, 12, 20);
    		LocalDate ld2 = LocalDate.now();
    		Period p1 = Period.between(ld, ld2);
    		System.out.println(p1.getYears());//1
    		System.out.println(p1.getMonths());//2
    		System.out.println(p1.getDays());//21
    
    	}

 日期的操縱

  • TemporalAdjuster : 時間校訂器。有時咱們可能須要獲取例如:將日期調整到「下個週日」等操做。
  • TemporalAdjusters : 該類經過靜態方法提供了大量的經常使用TemporalAdjuster 的實現
    //4.TemporalAdjuster : 時間校訂器
    	@Test
    	public void test4(){
    		LocalDateTime ldt = LocalDateTime.now();
    		System.out.println(ldt);//2017-03-13T16:36:56.641
    
    		LocalDateTime ldt1 = ldt.withDayOfMonth(10);
    		System.out.println(ldt1);//2017-03-10T16:36:56.641
    
    		LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    		System.out.println(ldt2);//2017-03-19T16:36:56.641
    
    		//自定義下一個週日
    		LocalDateTime ldt4 = ldt.with((l) ->{
    			LocalDateTime ldt3 = (LocalDateTime) l;
    			DayOfWeek dow = ldt3.getDayOfWeek();
    			if (dow.equals(DayOfWeek.SUNDAY)){
    				return ldt3.plusDays(7L);
    			}else if (dow.equals(DayOfWeek.MONDAY)){
    				return ldt3.plusDays(6L);
    			} else if (dow.equals(DayOfWeek.THURSDAY)){
    				return ldt3.plusDays(5L);
    			}else if (dow.equals(DayOfWeek.WEDNESDAY)){
    				return ldt3.plusDays(4L);
    			} else if (dow.equals(DayOfWeek.FRIDAY)){
    				return ldt3.plusDays(3L);
    			}else if(dow.equals(DayOfWeek.SATURDAY)){
    				return ldt3.plusDays(2L);
    			}else{
    				return ldt3.plusDays(1L);
    			}
    		});
    		System.out.println(ldt4);//2017-03-19T16:51:55.069
    	}

解析與格式化

java.time.format.DateTimeFormatter 類:該類提供了三種格式化方法:code

  •  預約義的標準格式
  • 語言環境相關的格式
  • 自定義的格式 
//5.DateTimeFormatter:解析與格式化
	@Test
	public void test5(){
		DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
		LocalDateTime ldt = LocalDateTime.now();

		String str = ldt.format(dtf);
		System.out.println(str);//2017-03-13

		System.out.println("-----------------------");
		//自定義本身的格式
		DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH時mm分ss秒");
		String str1 = dtf1.format(ldt);
		System.out.println(str1);//2017年03月13日17時13分26秒

		LocalDateTime ldt2 = LocalDateTime.parse(str1, dtf1);
		System.out.println(ldt2);//2017-03-13T17:13:26
	}

時區的處理

  • Java8 中加入了對時區的支持,帶時區的時間爲分別爲:ZonedDate、ZonedTime、ZonedDateTime

其中每一個時區都對應着ID,地區ID都爲「{區域}/{城市}」的格式例如:Asia/Shanghai 等
ZoneId:該類中包含了全部的時區信息
getAvailableZoneIds() : 能夠獲取全部時區時區信息
of(id) : 用指定的時區信息獲取ZoneId 對象orm

//6.ZonedDate、ZonedTime、ZonedDateTime
	@Test
	public void test6(){
		//獲取支持的全部時區
		Set<String> set =  ZoneId.getAvailableZoneIds();
		set.forEach(System.out::println);
	/*	Asia/Aden
		America/Cuiaba
		Etc/GMT+9
		Etc/GMT+8
		Africa/Nairobi
		America/Marigot
		Asia/Aqtau
		Pacific/Kwajalein
		America/El_Salvador
		Asia/Pontianak
		Africa/Cairo
		......
		*/
		LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
		System.out.println(ldt);//2017-03-13T17:22:15.483

		LocalDateTime ldt1 = LocalDateTime.now(ZoneId.of("Africa/Monrovia"));
		ZonedDateTime zdt = ldt1.atZone(ZoneId.of("Asia/Shanghai"));
		System.out.println(zdt);//2017-03-13T09:24:15.446+08:00[Asia/Shanghai]
	}
相關文章
相關標籤/搜索