Android 時間格式轉換筆記


會不會有一天 時間真的能改變:看 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.Datejava.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.CalendarDAY_OF_WEEK 取得傳入的日期對應的是星期幾。月份除了用 0..11 表達外還可以寫成 January 或是 Jan,會是存取日曆資料很重要的 API。

時光機

感謝各類別都有提供 getTime() 的強大 API 可以取得 milliseconds,就算用不同時間格式要轉換時間也是輕輕鬆鬆呢!

#Android #Time #Date





透過分享開發過程中遇過的一些問題、當中的思考過程和最後的解法,期待能和更多人一起集思廣益!

留言討論