Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

Share

CH13:時間與日期

Download to read offline

建立時間與日期的認知
認識Date與Calendar
使用新時間日期API
區分機器與人類時間概念

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

CH13:時間與日期

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

建立時間與日期的認知 認識Date與Calendar 使用新時間日期API 區分機器與人類時間概念

Views

Total views

204

On Slideshare

0

From embeds

0

Number of embeds

0

Actions

Downloads

30

Shares

0

Comments

0

Likes

0

×