Download presentation
Presentation is loading. Please wait.
2
時間與日期 學習目標 建立時間與日期的認知 認識Date與Calendar 使用JDK8新的時間日期API 區分機器與人類時間概念
3
時間的度量 格林威治標準時間 世界時 國際原子時 世界協調時間 Unix時間 epoch
4
時間的度量 就目前來說,即使標註為GMT,實際上談到時間指的是UTC時間 秒的單位定義是基於TAI,也就是銫原子輻射振動次數
Unix時間是1970年1月1日00:00:00 為起點而經過的秒數,不考慮閏秒
5
年曆簡介 儒略曆 格里高利曆 ISO8601標準 時間日期表示方法的標準,用以統一時間日期的資料交換格式
6
認識時區 牽涉到地理、法律、經濟、社會甚至政治等問題 UTC偏移(offset)
有些國家的領土橫跨的經度很大,一個國家有多個時間反而造成困擾,因而不採取每15度偏移一小時的作法 日光節約時間(Daylight saving time)、夏季時間(Summer time) 台灣也曾實施過日光節約時間
7
時間軸上瞬間的Date 取得系統時間,方法之一是使用System.currentTimeMillis()
代表1970年1月1日0時0分0秒0毫秒至今經過的毫秒數 機器的時間觀點
8
時間軸上瞬間的Date Date也是偏向機器的時間觀點
9
時間軸上瞬間的Date Date類別是從JDK1.0就已存在的API 除了範例中使用的兩個建構式外,其他版本的建構式都已廢除
getTime()之外的getXXX()方法都廢棄了 setTime()(用來設置epoch毫秒數)外的setXXX()方法也都廢棄了 Date實例基本上建議只用來當作時間軸上的某一瞬間
10
時間軸上瞬間的Date 不建議使用toString()來得知年月日等欄位資訊 有關於字串時間格式的處理,不再是Date的職責
11
格式化時間日期的DateFormat 字串時間格式的處理,職責落到了java.text.DateFormat身上
實作類別java.text.SimpleDateFormat 直接建構SimpleDateFormat實例 使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance()等靜態方法
12
格式化時間日期的DateFormat
13
格式化時間日期的DateFormat 直接建構SimpleDateFormat的好處是,可使用模式字串自訂格式
14
處理時間日期的Calendar 想要取得某個時間日期資訊,或者是對時間日期進行操作,可以使用Calendar實例
java.util.GregorianCalendar是其子類,實作了儒略曆與格里高利曆的混合曆
15
處理時間日期的Calendar 列舉值的一月是從0數字開始:
16
處理時間日期的Calendar 改變Calendar的時間
17
處理時間日期的Calendar 預設的改曆時間為格里高利曆 1582 年 10 月 15 日星期五
18
單純地使用365 * 24 * 60 * 60 * 1000當作一年的毫秒數並用以計算使用者歲數是不對的
19
設定TimeZone 使用java.util.TimeZone的getDefault()來取得預設時區資訊
20
設定TimeZone 想要取得指定時區的TimeZone實例,可以使用ID字串
21
設定TimeZone 想知道現在哥本哈根的時間
22
JDK8新時間日期API Date實例真正代表的並不是日期,最接近的概念應該是時間軸上特定的一瞬間 Date狀態仍是可變的
使用Calendar太麻煩、太痛苦了 Calendar狀態可變 JDK8中有了新的時間日期處理API,規格書為JSR310
23
機器時間觀點的API Date名稱看來像是人類的時間概念,實際卻是機器的時間概念 混淆機器與人類時間觀點會引發的問題之一像是日光節約時間
24
機器時間觀點的API 台灣已經不實施日光節約時間一段時間了,許多開發者並不知道過去有過日光節約時間 被名稱Date誤導它們代表日期
不該使用Date實例的toString()來得知人類觀點的時間資訊 Date實例應該只代表機器觀點的時間資訊,真正可靠的資訊只有內含的epoch毫秒數
25
機器時間觀點的API 取得Date實例,下一步該獲取時間資訊應該是透過Date的getTime()取得epoch毫秒數
26
機器時間觀點的API JDK8新時間日期處理API清楚地將機器對時間的概念與人類對時間的概念區隔開來 新舊API相容上
對於機器相關的時間概念,設計了Instant類別 代表自定義的Java epoch(1970 年 1 月 1 日)之後的某個時間點歷經的毫秒數 新舊API相容上 呼叫Date實例的toInstant()取得Instant 使用Date靜態方法from()將Instant轉Date
27
人類時間觀點的API 人類在時間概念的表達大多是籠統、片段的資訊 LocalDateTime、LocalDate、LocalTime
ZonedDateTime、OffsetDateTime Year、YearMonth、Month、MonthDay
28
人類時間觀點的API LocalDateTime包括日期與時間LocalDate只有日期 LocalTime只有時間
不具時區的時間與日期定義 基於ISO-8601年曆系統 只是對時間的描述
29
人類時間觀點的API 如果時間日期需要有帶有時區,可以基於LocalDateTime、LocalDate、LocalTime等來補齊缺少的資訊:
30
人類時間觀點的API UTC 偏移量與時區的概念是分開的。OffsetDateTime單純代表 UTC 偏移量
31
人類時間觀點的API 如果只想表示2014年,可以使用Year 如果想表示2014/5,可以使用YearMonth
如果想表示5/4,可以使用MonthDay
32
對時間的運算 某個日期起加上5天、6個月、3週後會的日期時間是什麼,並使用指定的格式輸出
33
對時間的運算 JDK8新日期時間處理實現了流暢API(Fluent API)的概念
34
對時間的運算 先前看過的HowOld範例,也可以使用新時間與日期API改寫
35
對時間的運算 某個日期起加上5天、6個月、3週後會的日期時間是什麼,並使用指定的格式輸出
36
對時間的運算 使用實作類別ChronoUnit的列舉實例來實作之前的CalendarUtil範例
37
年曆系統設計 java.time套件中的類別在需要採行年曆系統時都是採用單一的ISO8601年曆系統
如果需要其他年曆系統呢?需要明確採行java.time.chrono中等實作了java.time.chrono.Chronology介面的類別
38
年曆系統設計
39
年曆系統設計 MinguoChronology就是中華民國年曆,也就是台灣通行的年曆系統 將西元年月日轉換為民國年月日
想要同時表示民國日期與時間
Similar presentations