java JDK8 学习笔记——第13章 时间与日期
第十三章 時間與日期
13.1 認識時間與日期
13.1.1 時間的度量
1、格林威治標準時間GMT?
格林威治標準時間的正午是太陽抵達天空最高點之時。現在已經不作為標準時間使用。
2、世界時UT
世界時是借由觀測遠方星體跨過子午線而得,在引入UTC之前,GMT和UT是相同的。
3、國際原子時TAI?
將秒的國際單位定義為銫原子輻射振動91926331770周耗費的時間,從UT的1958年開始同步。
4、世界協調時UTC?
采用了閏秒修正,確保UTC與UT相差不會超過0.9秒,加入閏秒的時間通常會在6月底或12月底。
5、Unix時間?
定義為UTC時間1970年1月1日00:00:00為起點而經過的描述,不考慮閏秒修正,用以表達時間軸上的某一瞬間。
6、epoch?
某個特定時代的開始,時間軸上某一瞬間。
7、重點總結
(1)即使標注為GMT時間,實際上談到時間指的是UTC時間。?
(2)秒的單位定義是基于TAI,也就是銫原子輻射振動次數。
(3)UTC考慮了地球自轉越來越慢而又閏秒修正,確保哦UTC與UT相差不會超過0.9秒。?
(4)Unix時間是1970年1月1日00:00:00為起點而經過的秒數,不考慮閏秒。
13.1.2 年歷簡介
1、儒略歷
儒略歷是現今公歷的前身,用來取代羅馬歷,修正了羅馬歷隔三年設置一閏年的錯誤,改采四年一閏。
2、格里高利歷?
格里高利歷將儒略歷1582年10月4日星期四的隔天,訂為格里高利歷1582年10月15日星期五。
3、ISO 8601標準?
ISO 8601并非年歷系統,而是時間日期表示方法的標準,用意統一時間日期的數據交換格式。在ISO 8601標準的定義中,19世紀是指1900年到1999年,而格里高利歷的19世紀是指1801年到1900年。
13.1.3 認識時區
1、考慮了UTC偏移的時間表示上,通常會標識Z符號。
2、日光節約時間?
也稱為夏季時間,基本上就是在時時的第一天,讓白天的時間增加一小時,而最后一天結束后在調整一小時回來。
13.2 認識Date與Calendar
13.2.1 時間軸上瞬間的Date
1、取得系統時間的方法之一是:?
使用System.currentTimeMillis()方法,返回的是long類型的整數,代表1970年1月1日00:00:00至今經過的毫秒數。
2、Date實例?
Date實例基本上建議只用來當做時間軸上的某一瞬間。有關字符串時間格式的處理不再是Date的職責。
13.2.2 格式化時間日期的DateFormat
1、DateFormat是個抽象類,其操作類是java.text.SimpleDateFormat。
取得SimpleDateFormat實例的方法
(1)直接構建SimpleDateFormat實例?
(2)使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance()等靜態方法。
2、直接構建SimpleDateFormat的好處是,可使用模式字符串自定義格式。
3、相對于DateFormat可進行日期時間格式化,java.text.NumberFormat可用來進行數字格式化,他們都是java.text.Format的子類。
13.2.3 處理時間日期的Calendar
1、Calendar實例?
用于取得某個時間日期信息,或者是對時間日期進行操作。
Calendar是個抽象類,java.util.GregorianCalendar是其子類,操作了儒略歷與格里高利歷的混合歷,通過Calendar的getInstance()取得的Calendar實例,默認就是取得GregorianCalendar的實例。
2、如果打算只針對日期中某個字段加減,則可以使用roll()方法。
3、日歷時間可以使用GregorianCalendar的setGregorianCalendar()方法來修改,設為Date(Long.MAXVALUE)就是純粹的儒略歷,設為Date(Long.MINVALUE)就是純粹的格里高利歷。
4、注意:
在Calendar實例上進行add()之類的操作,會修改Calendar實例本身,為了避免調用yearsBetween()、daysBetween()之后傳入的Calendar自變量被修改,兩個方法中都對第一個自變量進行了clone()復制對象的動作。
13.2.4 設定TimeZone
使用java.util.TimeZone的getDefault()來取得默認時區信息。
13.3 JDK8新時間日期API
13.3.1 機器時間觀點的API
1、Calendar的getTime()返回false實例,取得Date實例,下一步應該獲取時間信息,應該是通過Date的getTime()取得epoch毫秒數。
2、機器相關的時間概念——Instant類
用以代表自定義的Java epoch之后的某個時間點歷經的毫秒數,精確度基本上是毫秒。使用Instant的靜態方法now()取得代表Java epoch毫秒數的Instant實例,取得Instant實例后,可以使用plusSeconds()、plusMillis()、plusNanos()、minusSeconds()、minusMillis()、minusNanos()來做時間軸上的運算,Instant實例本身不會變動,這些操作會返回新的Instant實例,代表運算后的瞬時。
13.3.2 人類時間觀點的API
1、LocalDateTime、LocalDate和LocalTime?
這些類基于ISO 8601年歷系統,是不具失時區的時間與日期定義。LocalDateTime、LocalDate和LocalTime 等類名稱開頭為Local,表示它們都只是對時間的描述,并沒有時區信息。
2、ZonedDateTime和OffsetDateTime?
ZonedDateTime和OffsetDateTime間可以通過toXXX()方法互轉,Instant通過atZone()與atOffset()轉為ZonedDateTime和OffsetDateTime,ZonedDateTime和OffsetDateTime也都可以通過toInstant()取得Instant,ZonedDateTime和OffsetDateTime都有toLocalDate()、toLocalTime()、toLocalDateTime()方法可以取得LocalDate、LocalTime和LocalDateTime。
3、Year、YearMonth、Month和MonthDay?
Month是enum類型,想要取得代表月份的數字,不要使用oridinal()方法,需要使用getValue()方法。
13.3.3 對時間的運算
1、TemporalAmount
對于時間的計量,新時間與日期API以類Duration來定義,可擁有計量天、時、分、秒的時間差,精確度調整可以達到納秒等級,而秒的最大值可以是long類型可保存值。對于年、月、星期、日的日期差,則使用Period類定義。
2、TemporalUnit?
plus()方法另一重載版本,接受java.time.temporal.TemporalUnit實例,java.time.temporal.ChronoUnit是TemporalUnit實作類,使用enum實作。
3、Temporal
Instant、LocalDateTime、LocalDate、LocalTime、ZonedDateTime和OffsetDateTime都操作了Temporal接口。
4、TemporalAccessor
TemporalAccessor定義了只讀的時間對象讀取操作,實際上Temporal是TemporalAccessor子接口,增加了對時間的處理操作。
MonthDay是只讀的。
13.3.4 年歷系統設計
1、java.time套件中的類在需要實行年歷系統時都是單一的ISO8601年歷系統。
2、需要使用其他年歷系統時?
需要明確實行java.util.chrono中等操作了java.time.chrono.Chronology接口類。
轉載于:https://www.cnblogs.com/java-stx/p/5178514.html
閱讀世界,共赴山海423全民讀書節,邀你共讀
總結
以上是生活随笔為你收集整理的java JDK8 学习笔记——第13章 时间与日期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想换行做 5G 的开发者到底该咋办?
- 下一篇: 湖南大学计算机学院软件专业杨磊,杨磊-湖