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