會不會有一天 時間真的能改變:看 Date、Time、Timestamp 和 Calendar 變變變
Android 開發上可能會遇到眾多的時間格式,像是紀錄日期用 Date、時間用 Time、紀錄當下的時間點用 Timestamp 以及如果需要年、月、日比較的資訊可以用 Calendar 等等,一樣都是時間,但不同時間格式間如何轉換?一起搭乘 Android 時光機來瞭解吧!
Date、Time 類
Java 最早是由 java.util.Date 類開始定義時間格式,但因為 java.util.Date
這一類別需要同時包含日期與時間的資訊,就算只要儲存日期也要額外指定時間的值,反之要儲存時間的資料亦然,對於開發上較為不便,當中年份的計算是從 1900 年計算增加或減少的年數,月份則是用 0..11 來表示:
* @param year the year minus 1900.
* @param month the month between 0-11.
因為時間格式還要經過換算,在操作上很不直覺,因此設計了 java.time
的類別,可以單獨儲存日期或是時間值,不但不用再額外儲存不需要的日期或時間,並且也能支援國際通用的曆法格式。
在 import Date 的格式時常出現 java.util.Date
和 java.sql.Date
兩組類別,在使用時要如何選擇呢?java.sql.Date
繼承自 java.util.Date
,可以透過 java.util.Date
中的 getTime() function 取得 nano seconds,之後再傳入 java.sql.Date
實作。
Timestamp 類
只有紀錄日期和時間還不夠!為了因應紀錄時間戳的需求,從 java.util.Date
衍生出了 java.sql.Timestamp
的類別。儘管年份同樣是從 1900 起算,月份也是 0..11,但 Timestamp 還可以精準記錄到毫秒 (nano second,介於 0..999999999 )。在資料庫上紀錄新增資料的時間也通常會用 Timestamp 作為紀錄格式。
Timestamp 原先提供兩組 API,一個是紀錄年、月、日、時、分、秒還要到毫秒,但這組紀錄方法已過時,已經被直接紀錄 milliseconds 的 API 取代:
Timestamp(long time)
milliseconds 的計算方式是從格林威治時間 1970 年 01 月 01 日 00 時 00 分 00 秒開始計算到時間戳的總秒數,用於排序、比較時間先後順序等會比前一個過時的 API 來得省力許多。
Calendar 類
雖然 java.util.Date
要什麼日期資訊都有,但卻少了對應星期的資訊!可以透過 java.util.Calendar
的 DAY_OF_WEEK
取得傳入的日期對應的是星期幾。月份除了用 0..11 表達外還可以寫成 January 或是 Jan,會是存取日曆資料很重要的 API。
時光機
感謝各類別都有提供 getTime()
的強大 API 可以取得 milliseconds,就算用不同時間格式要轉換時間也是輕輕鬆鬆呢!