Android程式中的時間

weixin_33936401發表於2018-04-25

9942787-6008efb791a91524.png
image.png

導言

眾所周知,所有的程式中都會用到時間,而且每個系統中都會有一個處理時間的工具類DateUtils。時間在不同的地方需要格式化為不同的形式,比如存資料庫,多數會採用時間戳;在介面上展示則會格式化為一些固定格式,類似於2018-04-25 18:15:22
如果App支援國際化,還需要處理跨國時間,需要考慮時區和夏令時。
下面就介紹一下在程式碼中怎麼處理不同地區時間的轉換。

時區

地球劃分24個時區,分別是東十二個區,西十二個區。以倫敦格林威治天文臺為零時區,向東為東一區到東十二區,向西是西一區到西十二區,東區時間比西區早,經度每15度為一個時區,比如北京位於東120度經線,屬於東八區。
程式中也有時區概念,以Java為例,可以通過下面方式獲取時區:

/**
 * 獲取美國東部時區
 */
public static TimeZone getEastUsTimeZone() {
    return TimeZone.getTimeZone("America/New_York");
}

/**
 * 獲取中國時區
 */
public static TimeZone getChinaTimeZone() {
    return TimeZone.getTimeZone("Asia/Shanghai");
}

時間戳

時間戳(Timestamp),是指從格林威治時間1970.01.01 00:00:00(北京時間1970.01.01 08:00:00)起至現在的總秒數,目前的時間戳是10位,如果以毫秒錶示則是13位。
時間戳在程式碼中很常用,尤其是後臺API介面,基本都需要返回時間戳,前端可以把時間戳格式化為自己想要的格式來展示。
Android中也是支援時間戳的,最常用的是獲取當前時間戳,程式碼如下:

//Android獲取當前時間戳
public static Long getCurrentTimestamp() {
    return System.currentTimeMillis();
}

夏令時和冬令時

高緯度和中緯度的許多國家為了充分利用夏季的太陽光照,節約照明用電,而又不變動作息時間,實行夏令時。即在夏季到來之前,把時針撥快一個小時,到下半季秋季到來之前,再把時針撥回一個小時。不同國家實行夏令時的時間不太一樣,美國是3月11日至11月7日。
我們國家有段時間也實行了夏令時(1986年-1991年),1992年就不在實行了。
如果App支援國際化功能,也需要考慮夏令時冬令時,Java中提供了方法可以判斷當前時間是否處於夏令時,方法如下:

/**
 *@param zone 時區,傳入不同的時區可以判斷不同地區是否處於夏令時
 */
public static boolean isDaylight(TimeZone zone, Date date) {
    return zone.useDaylightTime() && zone.isDaylightTime(date);
}

而且java中時間戳的轉換自動支援夏令時冬令時。

時間戳和日期的轉換

下面介紹一下時間戳和日期的相互轉換,以及不同時區間日期的轉換
Date轉換為指定時區的日期字串:

/**
 * Date 轉換為指定時區日期字串
 */
public static String date2Str(TimeZone timeZone, Date date, String pattern) {
    if (date == null) {
        return "";
    }
    if (timeZone == null) {
        timeZone = TimeZone.getDefault();
    }
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, Locale.US);
        dateFormat.setTimeZone(timeZone);
        return dateFormat.format(date);
    } catch (NullPointerException | IllegalArgumentException ex) {
        LogUtil.error(ex, ex.getMessage());
        ex.printStackTrace();
        return "";
    }
}

時間戳轉換為指定時區的日期字串

/**
 * 時間戳轉換為指定時區日期字串
 */
public static String timeMillis2Str(TimeZone timeZone, long milliSeconds, String pattern) {
    if (milliSeconds == 0) {
        return "";
    }
    return date2Str(timeZone, new Date(milliSeconds), pattern);
}

指定時區的字串轉換為時間戳

/**
 * 指定時區的日期字串轉換時間戳
 */
public static long str2TimeMillis(TimeZone timeZone, String dateStr, String pattern) {
   Date date = str2Date(timeZone, dateStr, pattern);
   return date.getTime();
}

從上面幾個方法中可以看出來,時間戳和日期字串主要是通過Date類進行轉換的,那麼Date是什麼呢?
Date物件中儲存的內容並不是年月日時分秒,而是一個long型變數,它的值是自1970.01.01 00:00:00至Date物件記錄時刻經過的毫秒數,即時間戳的毫秒錶示。呼叫Date的getTime()方法可以獲取這個值。

Date date = new Date();
System.out.println(date + "," + date.getTime());

總結

本文主要介紹幾個概念:時區、時間戳、夏令時,以及不同時區之間的時間轉換,包括時間戳和指定時區日期之間的轉換,希望對大家有幫助。

寫於2018.04.25下午23:00(位置:深圳南山區)

相關文章