日期和時(shí)間API
LocalDate 和 LocalTime
?????? LocalDate
類的實(shí)例是一個(gè)不可變對(duì)象芥挣,只提供了簡(jiǎn)單的日期空免,并不含當(dāng)天的時(shí)間信息蹋砚,同時(shí)不附帶任何和時(shí)區(qū)相關(guān)的信息坝咐。 LocalTime
- 使用靜態(tài)工廠方法
now
從系統(tǒng)時(shí)鐘中獲取當(dāng)前的日期:
LocalDate localDate = LocalDate.now();
//獲取年
int year = localDate.getYear();
//獲取月
int month = localDate.getMonthValue();
//獲取日
int day = localDate.getDayOfMonth();
- 使用靜態(tài)工廠方法
of
創(chuàng)建一個(gè)LocalDate
實(shí)例:
LocalDate date = LocalDate.of(2020,3,20);
- 使用靜態(tài)工廠方法
now
從系統(tǒng)時(shí)鐘中獲取當(dāng)前的時(shí)間:
LocalTime localTime = LocalTime.now();
//獲取小時(shí)
int hour = localTime.getHour();
//獲取分鐘
int minute = localTime.getMinute();
//獲取秒
int second = localTime.getSecond();
- 使用靜態(tài)工廠方法
of
創(chuàng)建一個(gè)LocalTime
實(shí)例:
//創(chuàng)建具有時(shí)分的LocalTime對(duì)象
LocalTime localTime = LocalTime.of(10,30);
//創(chuàng)建具有時(shí)分秒的LocalTime對(duì)象
LocalTime localTime = LocalTime.of(10,30,30);
合并日期和時(shí)間
?????? 復(fù)合類LocalDateTime
,是LocalDate
和 LocalTime
的合體,同時(shí)表示日期和時(shí)間框杜,但不帶有時(shí)區(qū)信息振劳±郑可以像 LocalDate
和 LocalTime
一樣弱贼,利用靜態(tài)工廠方法now
和 靜態(tài)工廠方法 of
創(chuàng)建吮旅。也可以通過(guò)合并LocalDate
對(duì)象 和 LocalTime
對(duì)象創(chuàng)建庇勃。
//now()靜態(tài)工廠方法創(chuàng)建當(dāng)前時(shí)間的LocalDateTime對(duì)象
LocalDateTime localDateTime = LocalDateTime.now();
//of()靜態(tài)工廠方法創(chuàng)建指定時(shí)間的LocalDateTime對(duì)象(2020-3-20 15:30:30)
LocalDateTime localDateTime = LocalDateTime.of(2020,3,20,15,30,30);
//合并LocalDate對(duì)象和LocalTime對(duì)象創(chuàng)建LocalDateTime對(duì)象
LocalDateTime localDateTime = LocalDateTime.of(localDate,localTime);
通過(guò) LocalDate#atTime
方法鸳兽,向LocalDate
對(duì)象傳遞LocalTime
對(duì)象揍异,創(chuàng)建一個(gè)LoaclTimeDate
對(duì)象:
//對(duì)LocalDate對(duì)象 傳遞 LocalTime對(duì)象
LocalDateTime localDateTime = localDate.atTime(localTime);
通過(guò)LocalTime#atDate
方法蒿秦,向LocalTime
對(duì)象 傳遞 LocalDate
對(duì)象,創(chuàng)建一個(gè)LoaclTimeDate
對(duì)象:
//對(duì)LocalTime對(duì)象 傳遞 LocalDate對(duì)象
LocalDateTime localDateTime = localTime.atDate(localDate);
LoaclTimeDate
對(duì)象可以借助toLocalDate()
方法 和 toLocalTime()
方法分別提取 LocalDate
對(duì)象 和 LocalTime
對(duì)象:
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();
機(jī)器的日期和時(shí)間格式
?????? 從計(jì)算機(jī)的角度來(lái)看渡处,建模時(shí)間最自然的格式是表示一個(gè)持續(xù)的時(shí)間段上某個(gè)點(diǎn)的單一大整型數(shù)。Instant類對(duì)時(shí)間建模的方式醇份,基本上以Unix元年的時(shí)間開(kāi)始所經(jīng)歷的秒數(shù)進(jìn)行計(jì)算僚纷。
Instant
可支持靜態(tài)工廠方法now
,獲取當(dāng)前時(shí)刻的時(shí)間戳怖竭。
Instant instant = Instant.now();
定義 Duration 或 Period
?????? LocalDate
類 、LocalTime
類广匙、Instant
類 和 LocalDateTime
類都是實(shí)現(xiàn)了 Temporal
接口鸦致。可以創(chuàng)建 兩個(gè)LocalTime
對(duì)象鳍寂、 兩個(gè) LocalDateTime
對(duì)象,或者兩個(gè) Instant
對(duì)象的之間的Duration
迄汛。(由于LocalDateTime
和 Instant 是為不同目的設(shè)計(jì)的,兩者不能混用睹逃。如果試圖在這兩類對(duì)象之間創(chuàng)建Duration
,會(huì)觸發(fā)一個(gè)DateTimeException
異常。)
Duration duration = Duration.between(localDateTime1,localDateTime2);
Duration duration = Duration.between(localTime1,localTime2);
Duration duration = Duration.between(instant1,instant2);
?????? 由于 Duration
類的靜態(tài)主要用于以秒和納秒衡量時(shí)間的長(zhǎng)短翼闹,所以不能僅向 between
方法中傳遞一個(gè)LocalDate
對(duì)象做參數(shù)。當(dāng)需要計(jì)量?jī)蓚€(gè)LocalDate
之間的時(shí)長(zhǎng) 時(shí),可以使用Period#between()
:
Period period = Period.between(LocalDate.of(2020,3,20),
LocalDate.of(2020,3,21));
?????? 除了以兩個(gè)Temporal對(duì)象的差值方式定義Duration
對(duì)象 或 Period
對(duì)象時(shí)長(zhǎng)外拒垃,還可以使用Duration
類 或 Period
類都提供工廠方法進(jìn)行創(chuàng)建創(chuàng)建。
Duration threeMinutes = Duration.ofMinutes(3);
Period tenDays = Period.ofDays(10);
操縱日期
?????? 想修改一個(gè)LocalDate
對(duì)象最直接的方法是使用withAttribute
方法横堡。withAttribute
方法會(huì)創(chuàng)建一個(gè)對(duì)象的副本命贴,并按照需要修改對(duì)應(yīng)的屬性污茵。(返回一個(gè)修改了屬性的LoacalDate
對(duì)象泞当,不修改原來(lái)的對(duì)象)
LocalDate date1 = LocalDate.of(2020,1,21);
LocalDate date2 = date1.withYear(2021);
LocalDate date3 = date1.withDayOfMonth(25);
LocalDate date4 = date1.with(ChronoField.MONTH_OF_YEAR,2);
?????? Temporal
對(duì)象使用 get
和 with
方法,對(duì)讀取和修改進(jìn)行區(qū)分開(kāi)陋桂。如果 Temporal 對(duì)象不支持請(qǐng)求訪問(wèn)的字段,就會(huì)拋出一個(gè) UnsupportedTemporalTypeException
異常秸脱。
-
Temporal#minus 創(chuàng)建一個(gè)副本,通過(guò)將當(dāng)前Temporal對(duì)象的值減去一定的時(shí)長(zhǎng)創(chuàng)建該副本
//2020-01-21 LocalDate date1 = LocalDate.of(2020,1,21); //2014-01-21 LocalDate date4 = date1.minus(6, ChronoUnit.YEARS);
-
Temporal#plus 創(chuàng)建一個(gè)副本,通過(guò)將當(dāng)前Temporal對(duì)象的值增加上一定的時(shí)長(zhǎng)創(chuàng)建該副本
//2020-01-21 LocalDate date1 = LocalDate.of(2020,1,21); //2026-01-21 LocalDate date4 = date1.plus(6, ChronoUnit.YEARS);
以聲明的方式操作LocalDate
對(duì)象:
// 2020-01-21
LocalDate date1 = LocalDate.of(2020,1,21);
// 2017-01-31
//可鏈?zhǔn)秸{(diào)用
LocalDate date2 = date1.plusDays(10).minusYears(3);
解析和格式化日期
-
創(chuàng)建新的格式器(
DateTimeFormatter
)最簡(jiǎn)單的方法是通過(guò)它的靜態(tài)工廠方法以及常量。(比如定義好的DateTimeFormatter.ISO_LOCAL_DATE
)LocalDate date1 = LocalDate.of(2020,1,21); String s1 = date1.format(DateTimeFormatter.ISO_LOCAL_DATE);
-
可以使用工廠方法
parse()
打到重創(chuàng)該日期對(duì)象的目的:LocalDate date1 = LocalDate.parse("2020-03-20",DateTimeFormatter.ISO_LOCAL_DATE);
-
可以使用工廠方法
DateTimeFormatter.ofPattern()
自定義模式格式化模式:LocalDateTime dateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String s1 = dateTime.format(formatter);
參考資料
Java8系列
Java 8 知識(shí)歸納(一)—— 流 與 Lambda