SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Downloaden Sie, um offline zu lesen
1
時間與日期
學習目標
• 建立時間與日期的認知
• 認識Date與Calendar
• 使用新時間日期API
• 區分機器與人類時間概念
2
時間的度量
• 格林威治標準時間
• 世界時
• 國際原子時
• 世界協調時間
• Unix時間
• epoch
3
時間的度量
• 就目前來說,即使標註為GMT,實際上談到
時間指的是UTC時間
• 秒的單位定義是基於TAI,也就是銫原子輻
射振動次數
• UTC考量了地球自轉越來越慢而有閏秒修正
• Unix時間是1970年1月1日00:00:00 為起點而
經過的秒數,不考慮閏秒
4
年曆簡介
• 儒略曆
• 格里高利曆
• ISO8601標準
– 時間日期表示方法的標準,用以統一時間日期的
資料交換格式
5
認識時區
• 牽涉到地理、法律、經濟、社會甚至政治等
問題
– UTC偏移(offset)
– 有些國家的領土橫跨的經度很大,一個國家有多
個時間反而造成困擾,因而不採取每15度偏移一
小時的作法
– 日光節約時間(Daylight saving time)、夏季時
間(Summer time)
– 台灣也曾實施過日光節約時間
6
時間軸上瞬間的Date
• 取得系統時間,方法之一是使用
System.currentTimeMillis()
• 代表1970年1月1日0時0分0秒0毫秒至今經
過的毫秒數
• 機器的時間觀點
7
時間軸上瞬間的Date
• Date也是偏向機器的時間觀點
8
時間軸上瞬間的Date
• Date類別是從JDK1.0就已存在的API
– 除了範例中使用的兩個建構式外,其他版本的建
構式都已廢除
– getTime()之外的getXXX()方法都廢棄了
– setTime()(用來設置epoch毫秒數)外的
setXXX()方法也都廢棄了
• Date實例基本上建議只用來當作時間軸上的
某一瞬間
9
時間軸上瞬間的Date
• 不建議使用toString()來得知年月日等欄
位資訊
• 有關於字串時間格式的處理,不再是Date的
職責
10
格式化時間日期的DateFormat
• 字串時間格式的處理,職責落到了
java.text.DateFormat身上
• 實作類別java.text.SimpleDateFormat
– 直接建構SimpleDateFormat實例
– 使用DateFormat的getDateInstance()、
getTimeInstance()、
getDateTimeInstance()等靜態方法
11
12
13
14
• 使用模式字串自訂格式
15
• 依建構SimpleDateFormat時指定的格式
,將指定的字串剖析為Date實例
16不應該這樣計算使用者歲數
處理時間日期的Calendar
• Date建議只作為時間軸上的瞬時代表
• 要格式化時間日期則透過DateFormat
• 想取得某時間日期資訊,或者是對時間日期
進行運算,可以使用Calendar實例
17
• GregorianCalendar是Calendar子類別
,實作了儒略曆與格里高利曆的混合曆
• 想取得年、月、日欄位的話:
18
• 列舉值的一月是從0數字開始:
19
• 設定時間日期等欄位
20
• 使用add()方法,來改變Calendar的時間
• 若打算只針對日期中某個欄位加減
21
• 預設的改曆時間為格里高利曆 1582 年 10 月
15 日星期五
• 使用GregorianCalendar的
setGregorianChange()修改改曆時間
– 設為 Date(Long.MAX_VALUE)就是純儒略曆
– 設為Date(Long.MIN_VALUE),就是純綷的格
里高利曆 22
• 單純地使用365 * 24 * 60 * 60 * 1000當作一年
的毫秒數是不對的
• 應該使用Calendar的相關操作
23
24
設定TimeZone
• 沒有使用時區資訊,會使用預設時區
• TimeZone的getDefault()取得預設時區
25
• 想取得指定時區的TimeZone實例,可以使
用ID字串
• 可用的ID可以使用
TimeZone.getAvailableIDs()來取得
• Calendar實例可以透過setTimeZone()
方法設定TimeZone
26
• 哥本哈根目前的時間
27
新時間日期API
• Date與Calendar的問題
– Date實例並非代表日期,最接近的概念是時間
軸上特定的一瞬間
– Date與Calendar狀態是可變的
– 使用Calendar太麻煩
• JDK8以後提供了新的時間日期處理API,規
格書為JSR310
28
機器時間觀點的API
• Date名稱上看來像是人類的時間概念,實際
卻是機器的時間概念
• 臺灣早期實施過日光節約時間
29
• 不該使用Date實例的toString()來得知人
類觀點的時間資訊
• Date實例只代表機器觀點的時間資訊,真正
可靠的資訊只有內含的epoch毫秒數
30
• JDK8新時間日期處理API最重要的作法,就
是清楚地將機器對時間的概念與人類對時間
的概念區隔開來
• 對於機器相關的時間概念,設計了Instant
類別,代表Java自定義的Java epoch後的某
個時間點歷經的毫秒數
• 精確度基本上是毫秒,但可添加奈秒(
nanosecond)精度的修正數值。
31
• 靜態方法now()取得代表Java epoch毫秒數的
Instant
• ofEpochMilli()可以指定Java epoch毫秒
數,ofEpochSecond()可以指定秒數
• 可以使用plusSeconds()、
plusMillis()、plusNanos()、
minusSeconds()、minusMillis()、
minusNanos()來做時間軸上的運算
• Instant實例本身無法變動
32
• 若取得了Date實例,而想改用Instant,
可以呼叫Date實例的toInstant()方法如
果有個Instant實例,可以使用Date的靜
態方法from()轉為Date
33
人類時間觀點的API
• 人類在時間概念的表達大多是籠統、片段的
資訊
– LocalDateTime、LocalDate、LocalTime
– ZonedDateTime、OffsetDateTime
– Year、YearMonth、Month、MonthDay
34
• 對於片段的日期時間
– LocalDateTime(包括日期與時間)
– LocalDate(只有日期)
– LocalTime(只有時間)
• 只是對本地時間的描述,不會有時區資訊
35
• 如果時間日期需要帶有時區
– ZonedDateTime
– OffsetDateTime
36
• UTC 偏移量與時區的概念是分開的
• OffsetDateTime單純代表 UTC 偏移量,
使用 ISO-8601
37
• 若只想表示2019年,可以使用Year
• 如果想表示2019/5,可以使用YearMonth
• 若只想表示5月,可以使用Month
• 如果想表示5/4,可以使用MonthDay
• 如果想取得代表月份的數字,不要使用
ordinal()方法,請透過getValue()方法
38
39
對時間的運算
• 某日起加上5天、6個月、3週後會的日期時間
40
• Duration可用於計量天、時、分、秒的時
間差
• 對於年、月、星期、日的日期差,則使用類
別Period定義
41
42
• Instant、LocalDate、LocalDateTime
、LocalTime、OffsetDateTime、
ZonedDateTime等類別,都實作了
Temporal介面
43
• plus(TemporalAmount amount)
• plus(long amountToAdd,
TemporalUnit unit)
• minus(TemporalAmount amount)
• minus(long amountToSubtract,
TemporalUnit unit)
44
• TemporalAccessor定義了時間物件(像
是日期、時間、偏移量等)唯讀操作
• Temporal是TemporalAccessor子介面,
增加了對時間的處理操作,像是plus()、
minus()、with()等方法
45
年曆系統設計
46
47
48
49

Weitere ähnliche Inhalte

Mehr von Justin Lin

Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理Justin Lin
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承Justin Lin
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別Justin Lin
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式Justin Lin
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子Justin Lin
 

Mehr von Justin Lin (20)

Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子
 

CH13:時間與日期