前言
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));