JDK8-time
伴隨lambda表達式、streams以及一系列小優化,Java 8 推出了全新的日期時間API,在教程中我們將通過一些簡單的實例來學習如何使用新API。Java處理日期、日歷和時間的方式一直為社區所詬病,將 java.util.Date設定為可變類型,以及SimpleDateFormat的非線程安全使其應用非常受限。Java也意識到需要一個更好的 API來滿足社區中已經習慣了使用JodaTime API的人們。全新API的眾多好處之一就是,明確了日期時間概念,例如:瞬時(instant)、 長短(duration)、日期、時間、時區和周期。同時繼承了Joda庫按人類語言和計算機各自解析的時間處理方式。不同于老版本,新API基于ISO標準日歷系統,java.time包下的所有類都是不可變類型而且線程安全。下面是新版API中java.time包里的一些關鍵類:
- ??? Instant:瞬時實例。
- ??? LocalDate:本地日期,不包含具體時間 例如:2014-01-14 可以用來記錄生日、紀念日、加盟日等。
- ??? LocalTime:本地時間,不包含日期。
- ??? LocalDateTime:組合了日期和時間,但不包含時差和時區信息。
- ??? ZonedDateTime:最完整的日期時間,包含時區和相對UTC或格林威治的時差。
新API還引入了ZoneOffSet和ZoneId類,使得解決時區問題更為簡便。解析、格式化時間的DateTimeFormatter類也全部重新設 計。
?
java.time包下有5個包組成
- java.time – 包含值對象的基礎包
- java.time.chrono – 提供對不同的日歷系統的訪問
- java.time.format – 格式化和解析時間和日期
- java.time.temporal – 包括底層框架和擴展特性
- java.time.zone – 包含時區支持的類
java.time包定義的類表示了日期-時間概念的規則,包括instants, durations, dates, times, time-zones and periods。這些都是基于ISO日歷系統,它又是遵循 Gregorian規則的。
還有一些方法前綴的含義,統一了api:
of:靜態工廠方法。
parse:靜態工廠方法,關注于解析。
now: 靜態工廠方法,用當前時間創建實例
get:獲取某些東西的值。
is:檢查某些東西的是否是true。
with:返回一個部分狀態改變了的時間日期對象拷貝(單獨一個with方法,參數為TemporalAdjusters類型)
plus:返回一個時間增加了的、時間日期對象拷貝(如果參數是負數也能夠有minus方法的效果)
minus:返回一個時間減少了的、時間日期對象拷貝
to:把當前時間日期對象轉換成另外一個,可能會損失部分狀態.
at:把這個對象與另一個對象組合起來,例如: date.atTime(time)。
format :根據某一個DateTimeFormatter格式化為字符串
?
類圖結構
來源:http://www.falkhausen.de/Java-8/java.time/Temporal-Hierarchy.html
?
類
TemporalQuery
@FunctionalInterface public interface TemporalQuery<R> {R queryFrom(TemporalAccessor temporal) }ChronoField
此枚舉類是作為get方法的參數獲取時間的值
它里面的屬性含義有的跟Calendar的成員變量含義差不多,想要了解一下可以看我的關于Calendar類詳解的文章 ,如果要看很詳細的講解可以去查看ChronoField類的官方api文檔
TemporalUnit
時間單位
public interface TemporalUnit {//返回add amount個 unit之后的值<R extends Temporal> R addTo(R temporal, long amount)//計算2個Temporal的時間差。long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)///返回unit的持續時間Duration getDuration()//檢查此unit是否表示日期的組成部分boolean isDateBased()//檢查unit的持續時間是否為估計值。boolean isDurationEstimated()//檢查此unit是否被支持default boolean isSupportedBy(Temporal temporal)//檢查此unit是否表示時間的組成部分boolean isTimeBased()//獲取unit的顯示名稱String toString() }TemporalAmount
時間數量接口
實現類
- Duration
Duration由固定秒數定義,精確到納秒。例如:34.5 seconds ,0.0003 seconds,可由day,hour,minute互相轉換,因為是固定的。
- Period
Period為一段時間,包括多個時間域,例如:2 years, 3 months and 4 days
public interface TemporalAmount {//add to TemporalTemporal addTo(Temporal temporal)//get unit valuelong get(TemporalUnit unit)//獲取支持的Unit列表List<TemporalUnit> getUnits()//sub from TemporalTemporal subtractFrom(Temporal temporal) }?
TemporalAccessor
public interface TemporalAccessor {//獲取指定時間域的int值default int get(TemporalField field);//獲取指定時間域的long值long getLong(TemporalField field);Gets the value of the specified field as a long.//是否支持指定時間域boolean isSupported(TemporalField field);//返回一個時間對象,通過query,query是個函數接口。default <R> R query(TemporalQuery<R> query);//返回指定時間域的有效范圍default ValueRange range(TemporalField field); }Temporal
public interface Temporal extends TemporalAccessor {//是否支持Unitboolean isSupported(TemporalUnit unit)//減時間單位default Temporal minus(long amountToSubtract, TemporalUnit unit)//減相對時間default Temporal minus(TemporalAmount amount)Returns an object of the same type as this object with an amount subtracted.//加時間單位Temporal plus(long amountToAdd, TemporalUnit unit)//加相對時間default Temporal plus(TemporalAmount amount)//計算時間差long until(Temporal endExclusive, TemporalUnit unit)//時間調整default Temporal with(TemporalAdjuster adjuster)//時間調整Temporal with(TemporalField field, long newValue) }TemporalAdjusters
時間調整器接口,函數接口。
此類配合java.time基礎包中類的with方法:
@FunctionalInterface public interface TemporalAdjuster {//調整時間Temporal adjustInto(Temporal temporal) } // 以下2種方式等價,推薦第2種。temporal = thisAdjuster.adjustInto(temporal);temporal = temporal.with(thisAdjuster);Month
Month是個枚舉,表示一年的12個月
Month有個int屬性,表示每個月份對應的數字。不要使用ordinal()獲取月份對應數字,而是使用getValue()方法。
?
DayOfWeek
枚舉,表示每周的某天。
有個int屬性,表示每個星期幾對應的數字。不要使用ordinal()獲取月份對應數字,而是使用getValue()方法。
數字從1到7分別代表星期一到星期日。固定不變,不支持根據local不同星期日對應不同數字。如有需要,通過WeekFields設置。
Year
YearMonth
Instant
MonthDay
LocalDate
LocalDateTime
LocalTime
Era
表示紀年
實現類:
- IsoEra:ISO,沒有任務Era定義。枚舉類型,包括'Current era' (CE) for years on or after 0001-01-01 (ISO), and 'Before current era' (BCE) for years before that.
- HijrahEra:回歷。枚舉類型,包括:AH (Anno Hegirae,伊斯蘭紀元)
- MinguoEra:民國紀年。枚舉類型,包括BEFORE_ROC,ROC 。Republic Of China.
- JapaneseEra:日本紀年。class類型。
- ThaiBuddhistEra:泰國佛歷。枚舉類型。包括:BE,BEFORE_BE。
DateTimeFormatter
java.util.Date或java.util.Calendar到新庫類的轉換
轉換可通過下面的方法進行。
Date.toInstant()
Date.from(Instant)
Calendar.toInstant()
日期和時間模式
日期和時間格式由?日期和時間模式字符串?指定。在?日期和時間模式字符串?中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字符串元素。文本可以使用單引號 (') 引起來,以免進行解釋。所有其他字符均不解釋,只是在格式化時將它們簡單復制到輸出字符串。
簡單的講:這些 A ——Z,a —— z 這些字母(不被單引號包圍的)會被特殊處理替換為對應的日期時間,其他的字符串還是原樣輸出。
日期和時間模式(注意大小寫,代表的含義是不同的)如下:
?
時區
示例1:
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime t = LocalDateTime.parse("2019-11-12 00:00:00",f);Instant i = t.toInstant(ZoneOffset.UTC);Long s = i.getEpochSecond();輸出:
t:2019-11-12T00:00
i:2019-11-12T00:00:00Z
s:1573516800(北京時間:2019-11-12 08:00:00)
示例2:
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime t = LocalDateTime.parse("2019-11-12 00:00:00",f);Instant i = t.toInstant(ZoneOffset.ofHours(8));Long s = i.getEpochSecond();輸出:
t:2019-11-12T00:00
i:2019-11-11T16:00:00Z
s:1573488000(北京時間:2019-11-12 00:00:00)
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: redis(9)--数据库
- 下一篇: redis(10)--RDB持久化