Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

CH13:時間與日期

133 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

×