1. 程式人生 > >LocalDate和LocalTime的用法介紹

LocalDate和LocalTime的用法介紹

  在JAVA中,常用的處理日期和時間的類主要有Date,Calendar,而在JDK1.8中,新增了兩個處理日期和時間的類,一個是LocalDate,另一個是LocalTime,下面我來介紹一下這兩個類中常用方法的用法。

 1、LocalDate

  LocalDate主要是用來處理日期的類,主要有以下方法:

方法 說明 舉例
LocalDate.now() 獲取當前日期
LocalDate localDate = LocalDate.now();
System.out.println(localDate);

 執行結果為:2019-01-07

LocalDate.of(int year, int month, int dayOfMonth)

根據引數設定日期,引數分別為年,月,日

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate);

 執行結果為:2019-01-07

localDate.getDayOfMonth()

localDate.getDayOfWeek()

localDate.getDayOfYear()

獲取當前日期是所在月的第幾天

獲取當前日期是星期幾(星期的英文全稱)

獲取當前日期是所在年的第幾天

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.getDayOfMonth());
System.out.println(localDate.getDayOfWeek());
System.out.println(localDate.getDayOfYear());

執行結果為:7,MONDAY,7

localDate.getMonth()

localDate.getMonthValue()

localDate.lengthOfMonth()

獲取當前日期所在月份(月份的英文全稱)

獲取當前日期所在月份的數值

獲取當前日期所在月份有多少天

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.getMonth());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.lengthOfMonth());

執行結果為:JANUARY,1,31

 

localDate.lengthOfYear()

localDate.isLeapYear()

獲取當前日期所在年有多少天

獲取當前日期所在年是否是閏年

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.lengthOfYear());
System.out.println(localDate.isLeapYear());

 執行結果為:365,false

localDate.withDayOfMonth(int dayOfMonth)

localDate.withDayOfYear(int dayOfYear)

localDate.withMonth(int month)

localDate.withYear(int year)

with開頭的方法,我的理解是將引數替換localDate中的對應

屬性,重新計算得到新的日期。

將引數中的"日"替換localDate中的"日"

將引數中的天數替換localDate中的天數

將引數中的"月"替換localDate中的"月"

將引數中的"年"替換localDate中的"年"

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.withDayOfMonth(2));
System.out.println(localDate.withDayOfYear(40));
System.out.println(localDate.withMonth(2));
System.out.println(localDate.withYear(2020));

 執行結果為:

2019-01-02,

2019-02-09,

2019-02-07,

2020-01-07

localDate.minusDays(long days)

localDate.minusWeeks(long weeks)

localDate.minusMonths(long months)

localDate.minusYears(long years)

localDate.plusDays(long days)

localDate.plusWeeks(long weeks)

localDate.plusMonths(long months)

localDate.plusYears(long years)

將當前日期減一天

將當前日期減一週

將當前日期減一月

將當前日期減一年

將當前日期加一天

將當前日期加一週

將當前日期加一月

將當前日期加一年

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.minusDays(1));
System.out.println(localDate.minusMonths(1));
System.out.println(localDate.minusWeeks(1));
System.out.println(localDate.minusYears(1));
System.out.println(localDate.plusDays(1));
System.out.println(localDate.plusMonths(1));
System.out.println(localDate.plusWeeks(1));
System.out.println(localDate.plusYears(1));

 執行結果為:

2019-01-06
2018-12-07
2018-12-31
2018-01-07
2019-01-08
2019-02-07
2019-01-14
2020-01-07

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 2、LocalTime

  LocalTime主要是用來處理時間的類,主要有以下方法:

方法 說明 舉例
LocalTime.now() 獲取當前時間
LocalTime localTime = LocalTime.now();
System.out.println(localTime);

 執行結果為:22:53:44.277

LocalTime.of(int hour, int minute) 

LocalTime.of(int hour, int minute, int second)

根據引數設定時間,引數分別為時,分

根據引數設定時間,引數分別為時,分,秒

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime);
localTime = LocalTime.of(12,35);
System.out.println(localTime);

 執行結果為:12:35:59,12:35

localTime.getHour()

localTime.getMinute()

localTime.getSecond()

獲取當前時間的小時數

獲取當前時間的分鐘數

獲取當前時間的秒數

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());

執行結果為:12,35,59

localTime.withHour(int hour)

localTime.withMinute(int minute)

localTime.withSecond(int second)

with開頭的方法,我的理解是將引數替換localTime中的對應屬性,

重新計算得到新的時間。

將引數中的"小時"替換localTime中的"小時"

將引數中的"分鐘"替換localTime中的"分鐘"

將引數中的"秒"替換localTime中的"秒"

 
LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.withHour(1));
System.out.println(localTime.withMinute(1));
System.out.println(localTime.withSecond(1));

 執行結果為:

01:35:59
12:01:59
12:35:01

localTime.minusHours(long hours)

localTime.minusMinutes(long minutes)

localTime.minusSeconds(long seconds)

localTime.plusHours(long hours)

localTime.plusMinutes(long minutes)

localTime.plusSeconds(long seconds)

將當前時間減一小時

將當前時間減一分鐘

將當前時間減一秒

將當前時間加一小時

將當前時間加一分鐘

將當前時間加一秒

 
LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.minusHours(1));
System.out.println(localTime.minusMinutes(1));
System.out.println(localTime.minusSeconds(10));
System.out.println(localTime.plusHours(1));
System.out.println(localTime.plusMinutes(1));
System.out.println(localTime.plusSeconds(10));

 執行結果為:

11:35:59
12:34:59
12:35:49
13:35:59
12:36:59
12:36:09

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 3、日期 + 時間

  從1和2中可以看出,LocalDate的方法主要都是用來處理日期的,而LocalTime的方法主要都是用來處理時間的,但兩個類都提供了表示日期 + 時間的方法。

LocalDate提供了atTime方法,用來表示日期 + 時間

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.atTime(LocalTime.now()));
System.out.println(localDate.atTime(10,30));
System.out.println(localDate.atTime(10,30,59));

 

執行結果為:

2019-01-07T23:21:32.804
2019-01-07T10:30
2019-01-07T10:30:59

 

LocalTime提供了atDate方法,用來表示日期 + 時間

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.atDate(LocalDate.of(2019,1,7)));

 

執行結果為:2019-01-07T12:35:59

 

 

 4、格式轉換

  從3中我們可以看出,表示日期 + 時間後,格式發生了變化,原來atTime和atDate方法的返回值都是LocalDateTime類,這個類把toString()方法重寫了,導致輸出的格式變化了。

@Override
public String toString() {
    return date.toString() + 'T' + time.toString();
}

 

那麼想要轉換日期或時間的格式該怎麼辦呢?

LocalDate和LocalTime都提供了格式轉換的方法,format和parse

方法 說明 舉例
LocalDate.format(DateTimeFormatter formatter)

將LocalDate型別的資料轉換為String型別的資料,引數為DateTimeFormatter類,該類提供了ofPattern(String pattern)方法,可傳入相應的日期格式:

yyyy,

yyyy-MM,

yyyy-MM-dd,

yyyy-MM-dd HH,

yyyy-MM-dd HH:mm,

yyyy-MM-dd HH:mm:ss

 

注:若LocalDate未呼叫atTime方法,則表示LocalDate只表示日期,則此時不能轉換帶有時間格式的表示式

LocalDate localDate = LocalDate.of(2019,1,7);
LocalTime localTime = LocalTime.now();

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy");
System.out.println(localDate.atTime(localTime).format(f));

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM");
System.out.println(localDate.atTime(localTime).format(f2));

DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println(localDate.atTime(localTime).format(f3));

DateTimeFormatter f4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(localDate.atTime(localTime).format(f4));

DateTimeFormatter f5 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(localDate.atTime(localTime).format(f5));

DateTimeFormatter f6 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
System.out.println(localDate.atTime(localTime).format(f6));

 執行結果為:

2019
2019-01
2019-01-07
2019-01-07 23:49:08
2019-01-07 23:49
2019-01-07 23

LocalTime.format(DateTimeFormatter formatter)

 

將LocalTime型別的資料轉換為String型別的資料,引數為DateTimeFormatter類,

該類提供了ofPattern(String pattern)方法,可傳入相應的日期格式:

yyyy,

yyyy-MM,

yyyy-MM-dd,

yyyy-MM-dd HH,

yyyy-MM-dd HH:mm,

yyyy-MM-dd HH:mm:ss

 

注:若LocalTime未呼叫atDate方法,則表示LocalTime只表示時間,則此時不能轉換帶有日期格式的表示式

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(LocalTime.now().atDate(LocalDate.now()).format(formatter));

 執行結果為:2019-01-07 23:07:06

 

其他格式這裡就不一一列舉了

LocalDate.parse(CharSequence text)

將日期字串轉換成LocalDate型別,不能轉換帶時間格式的字串

System.out.println(LocalDate.parse("2019-10-15"));

執行結果為:2019-10-15

LocalTime.parse(CharSequence text)

將時間字串轉換成LocalTime型別,不能轉換帶日期格式的字串

System.out.println(LocalTime.parse("22:35:40"));

 執行結果為:22:35:40

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 5、總結

  JDK1.8將處理日期和時間的類從原來的Date,Calendar變成了LocalDate和LocalTime兩個類,從原來的一個類處理日期 + 時間,變成了由兩個類各司其職,更加體現了面向物件的思想,兩個類都各自提供了相應範圍內的方法,個人覺得有利有弊。有利的是兩個類對各自範圍內的日期(時間)的計算都提供了更好的處理方法,雙方互不干擾,更加的方便。不利的是在同時需要日期和時間的場景下,這兩個類目前提供的atTime和atDate方法還不能令人滿意,使用起來不是很方便(還需要轉換一下格式)。另外,LocalDate型別對應資料庫的日期型別的欄位時,是否可以像Date型別那樣方便,有待研究。

  好了,先說到這吧!