一. LocalDate、LocalTime、Instant、Duration以及Period
1.LocalDate只提供日期,不含當天時間信息
LocalDate date = LocalDate.of(2018, 5, 03);
int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek();
int len = date.lengthOfMonth();
boolean leap = date.isLeapYear();
LocalDate today = LocalDate.now();
int year1 = date.get(ChronoField.YEAR);
int month1 = date.get(ChronoField.MONTH_OF_YEAR);
int day1 = date.get(ChronoField.DAY_OF_MONTH);
2.LocalTime:一天中的時間
LocalTime time = LocalTime.of(13, 45, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
LocalDate localDate = LocalDate.parse("2014-03-24");
LocalTime localTime = LocalTime.parse("14:34:22");
3.LocalDateTime是LocalDate和LocalTime的合體
同時表示了日期和時間,單不帶有時區信息,可以直接創建也可以通過合併日期和時間對象構造。
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
LocalDate date1 = dt1.toLocalDate();
LocalTime time1 = dt1.toLocalTime();
4.java.time.Instant類對時間建模的方式
基本上是以Unix元年時間(傳統的設定爲UTC時區1970年1月1日午夜時分)開始所經歷的秒數進行計算。
可以通過向靜態工廠方法ofEpochSecond傳遞一個代表秒數的值創建一個該類的實例。
Instant instant1 = Instant.ofEpochSecond(3);
Instant instant2 = Instant.ofEpochSecond(3, 0);
Instant instant3 = Instant.ofEpochSecond(2, 1_000_000);//2秒之後再加上100萬納秒(1秒)
Instant instant4 = Instant.ofEpochSecond(4, -1_000_000);//4秒之前的100萬納秒(1秒)
以上類都實現了Temporal接口。Temporal接口定義瞭如何讀取和操縱爲時間建模的對象的值。
5.Duration.between()兩個對象之間的間隔
Duration d1 = Duration.between(time, time1);
Duration d2 = Duration.between(dt1, dt2);
Duration d3 = Duration.between(instant1, instant2);
6.Period類:以年、月或者日的方式對多個時間單位建模。
Period tenDays = Period.between(LocalDate.of(2014, 3, 8),
LocalDate.of(2014, 3, 18));
Duration threeMinutes = Duration.ofMinutes(3);
Duration fourMinutes = Duration.of(4, ChronoUnit.MINUTES);
Period elevenDays = Period.ofDays(11);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
日期-時間類中表示時間間隔的通用方法:
方法名 |
是否是靜態方法 |
方法描述 |
between |
是 |
創建兩個時間點之間的interval |
from |
是 |
由一個臨時時間創建的interval |
of |
是 |
由它的組成部分創建的interval的實例 |
parse |
是 |
由字符串創建的interval的實例 |
addTo |
否 |
創建該interval的副本,並將其疊加到某個指定的temporal對象 |
get |
否 |
讀取該interval的狀態 |
isNegative |
否 |
檢查該interval是否爲負值,不包含零 |
isZero |
否 |
檢查該interval的時長是否爲零 |
minus |
否 |
通過減去一定的時間創建該interval的副本 |
multipliedBy |
否 |
將interval的值乘以某個標量創建該interval的副本 |
negated |
否 |
以忽略某個時長的方式創建該interval的副本 |
plus |
否 |
以增加某個指定的時長的方式創建該interval的副本 |
subtractFrom |
否 |
從指定的temporal對象中減去該interval |
二. 操縱、解析和格式化
1.LocalDate、LocalTime、LocalDateTime、Instant表示時間點的日期-時間類的通用方法:
他們都不會修改原來的對象。
方法名 |
是否靜態方法 |
描述 |
from |
是 |
依據傳入的Temporal對象創建對象實例 |
now |
是 |
依據系統時鐘創建Temporal |
of |
是 |
由Temporal對象的某個部分創建該對象的實例 |
parse |
是 |
由字符串創建Temporal對象的實例 |
atOffset |
否 |
將Temporal對象和某個時區偏移相結合 |
atZone |
否 |
將Temporal對象和某個時區相結合 |
format |
否 |
使用某個指定的格式器將Temporal對象轉換爲字符串(Instant類不提供改方法) |
get |
否 |
讀取Temporal對象的某一部分的值 |
minus |
否 |
創建Temporal對象的一個副本,通過將當前Temporal對象的值減去一定的時長創建該副本 |
plus |
否 |
創建Temporal對象的一個副本,通過將當前Temporal對象的值加上一定的時長創建該副本 |
with |
否 |
以該Temporal對象爲模板,對某些狀態進行修改創建該對象的副本 |
2.TemporalAdjuster類中的工廠方法
方法名 |
描述 |
dayOfWeekInMonth |
創建一個新的日期,它的值爲同一個月中每一週的第幾天 |
firstDayOfMonth |
創建一個新的日期,它的值爲當月的第一天 |
firstDayOfNextMonth |
創建一個新的日期,它的值爲下月的第一天 |
firstDayOfNextYear |
創建一個新的日期,它的值爲明年的第一天 |
firstDayOfYear |
創建一個新的日期,它的值爲當年的第一天 |
firstInMonth |
創建一個新的日期,它的值爲同一個月中,第一個符合星期幾要求的值 |
lastDayOfMonth |
創建一個新的日期,它的值爲當月的最後一天 |
lastDayOfNextMonth |
創建一個新的日期,它的值爲下的最後一天 |
lastDayOfNextYear |
創建一個新的日期,它的值爲明年的最後一天 |
lastDayOfYear |
創建一個新的日期,它的值爲今年的最後一天 |
lastInMonth |
創建一個新的日期,它的值爲同一個月中,最後一個符合星期幾要求的值 |
next/previous |
創建一個新的日期,並將其值設定爲日期調整後或調整前,第一個符合指定星期幾要求的日期 |
nextOrSame/previousOrSame |
創建一個新的日期,並將其值設定爲日期調整後或調整前,第一個符合指定星期幾要求的日期,如果該日期已經符合要求,直接返回該對象 |
3.打印輸出及解析日期-時間對象
DateTimeFormatter:格式化及解析日期-時間對象。
與老的DateFormat相比較,DateTimeFormatter實例都是線程安全的。所以能夠以單例模式創建格式器實例。
LocalDate date2 = LocalDate.of(2019, 4, 24);
String s1 = date2.format(DateTimeFormatter.BASIC_ISO_DATE);//20190424
String s2 = date2.format(DateTimeFormatter.ISO_LOCAL_DATE);//2014-04-24
LocalDate date3 = LocalDate.parse("20190424", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date4 = LocalDate.parse("2019-04-24", DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter類還支持一個靜態工廠方法,它可以按照某個特定的模式創建格式器
DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder()
.appendText(ChronoField.DAY_OF_MONTH)
.appendLiteral(". ")
.appendText(ChronoField.MONTH_OF_YEAR)
.appendLiteral(". ")
.appendText(ChronoField.YEAR)
.parseCaseInsensitive()
.toFormatter(Locale.ITALIAN)
三. 處理不同的時區和曆法
ZoneId:地區ID都爲“{區域}/{城市}”的格式,這些地區集合的設定都由英特網編號分配機構(IANA)的時區數據庫提供
ZoneId romeZone = ZoneId.of("Europe/Rome");
ZoneId對象可以與LocalDate、LocateDateTime或者是Instant對象整合起來,構造爲一個ZoneDateTime實例,它代表了相對於指定時區的時間點。
LocalDate date7 = LocalDate.of(2014, Month.MARCH, 18);
ZonedDateTime zdt1 = date7.atStartOfDay(romeZone);
LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45);
ZonedDateTime zdt2 = dateTime.atZone(romeZone);
Instant instant = Instant.now();
ZonedDateTime zdt3 = instant.atZone(romeZone);