JDK 8對時間日期應用的改進詳解

前言

1.8之前JDK自帶的日期處理類非常不方便,我們處理的時候經常是使用的第三方工具包,比如commons-lang包等。不過1.8出現之後這個改觀了很多,比如日期時間的創建、比較、調整、格式化、時間間隔等。這些類都在java.time包下。比原來實用了很多。

1.1 LocalDate/LocalTime/LocalDateTime

(1)LocalDate爲日期處理類、LocalTime爲時間處理類、LocalDateTime爲日期時間處理類,方法都類似,具體可以看API文檔或源碼,選取幾個代表性的方法做下介紹。

now相關的方法可以獲取當前日期或時間,of方法可以創建對應的日期或時間,parse方法可以解析日期或時間,get方法可以獲取日期或時間信息,with方法可以設置日期或時間信息,plus或minus方法可以增減日期或時間信息;

(2)LocalDate/LocalDateTime/LocalTime與Date的互轉

// 01. java.util.Date --> java.time.LocalDateTime
public void UDateToLocalDateTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
}

// 02. java.util.Date --> java.time.LocalDate
public void UDateToLocalDate() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalDate localDate = localDateTime.toLocalDate();
}

// 03. java.util.Date --> java.time.LocalTime
public void UDateToLocalTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalTime localTime = localDateTime.toLocalTime();
}

// 04. java.time.LocalDateTime --> java.util.Date
public void LocalDateTimeToUdate() {
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

// 05. java.time.LocalDate --> java.util.Date
public void LocalDateToUdate() {
LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

// 06. java.time.LocalTime --> java.util.Date
public void LocalTimeToUdate() {
LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

1.2 TemporalAdjusters

(1)這個類在日期調整時非常有用,比如得到當月的第一天、最後一天,當年的第一天、最後一天,下一週或前一週的某天等。
看下接口定義,就一個方法

@FunctionalInterface
public interface TemporalAdjuster {

        Temporal adjustInto(Temporal temporal);
}

這裏一些常用的操作在TemporalAdjusters類已經預定義了

TemporalAdjusters的一些預定義方法

dayOfWeekInMonth 創建一個新的日期,值爲同一個月中每一週的第幾天

firstDayOfMonth創建一個新的日期,它的值爲當月的第一天 

firstDayOfNextMonth 創建一個新的日期,它的值爲下月的第一天

firstDayOfNextYear 創建一個新的日期,它的值爲明年的第一天 

firstDayOfYear創建一個新的日期,它的值爲當年的第一天 

firstInMonth 創建一個新的日期,它的值爲同一個月中,第一個符合星期幾要求的值

lastDayOfMonth 創建一個新的日期,它的值爲當月的最後一天 

lastDayOfNextMonth創建一個新的日期,它的值爲下月的最後一天

 lastDayOfNextYear 創建一個新的日期,它的值爲明年的最後一天
 
lastDayOfYear 創建一個新的日期,它的值爲今年的最後一天 

lastInMonth創建一個新的日期,它的值爲同一個月中,最後一個符合星期幾要求的值 

next/previous創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星 期幾要求的日期

nextOrSame/previousOrSame創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星期幾要求的日期,如果該日期已經符合要求,直接返回該對象
​

(2)下面看下代碼實現的例子:

	@Test
	public void testName() {
		LocalDate date = LocalDate.parse("2017-08-15");
		//獲取這個月的第一個週末的時間
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));//2017-08-06
		
		//獲取上個月的最後一週
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(0, DayOfWeek.SUNDAY)));//2017-07-30
		
		//獲取這個月的倒數第一個週末的時間
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(-1, DayOfWeek.SUNDAY)));//2017-08-27
		
		//獲取這個月的第一個週末的時間,上面的dayOfWeekInMonth更靈活,可以定義第幾周
		System.out.println(date.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)));//2017-08-06
		
		//其底層調用的是
//		  return TemporalAdjusters.dayOfWeekInMonth(1, dayOfWeek);
		
		//明年的第一天
		System.out.println(date.with(TemporalAdjusters.firstDayOfNextYear()));//2018-01-01
		
		//獲取下週5的時間
		System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));//2017-08-18
		System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));//2017-08-22,始終返回下週的某個時間
		
		//獲取周2時間
		System.out.println(date.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)));//2017-08-15,如果當前時間剛好是星期三,那麼就返回當前時間
		
		// 獲取本月最後一天
		System.out.println(date.with(TemporalAdjusters.lastDayOfMonth()));//2017-08-31
	}

1.3 DateTimeFormatter

1)以前日期格式化一般用SimpleDateFormat類,但是不怎麼好用,現在1.8引入了DateTimeFormatter類,默認定義了很多常量格式(ISO打頭的),在使用的時候一般配合LocalDate/LocalTime/LocalDateTime使用,比如想把當前日期格式化成yyyy-MM-dd hh:mm:ss的形式:

(2)下面用一段代碼作爲例子

LocalDateTime dt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");       
System.out.println(dtf.format(dt));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章