一. LocalDate、LocalTime、Instant、Duration以及Periodjava
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的合體app
同時表示了日期和時間,單不帶有時區信息,能夠直接建立也能夠經過合併日期和時間對象構造。ide
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類對時間建模的方式ui
基本上是以Unix元年時間(傳統的設定爲UTC時區1970年1月1日午夜時分)開始所經歷的秒數進行計算。spa
能夠經過向靜態工廠方法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接口定義瞭如何讀取和操縱爲時間建模的對象的值。orm
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);