簡體   English   中英

System.currentTimeMillis() 是否返回 UTC 時間?

[英]does System.currentTimeMillis() return UTC time?

我想以毫秒為單位獲取當前的 UTC 時間。 我搜索了谷歌並得到了一些 System.currentTimeMillis() 確實返回 UTC 時間的答案。 但事實並非如此。 如果我執行以下操作:

long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();

所有三個時間幾乎相同(由於調用而差異以毫秒為單位)。

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

這次不是UTC時間,而是我的時區時間。 如何在android中獲取當前的UTC時間?

您顯示的所有三行都將給出自 unix 紀元以來的毫秒數,這是一個固定的時間點,不受本地時區的影響。

您說“這次不是 UTC 時間”-我懷疑您實際上診斷錯誤了。 我建議為此使用epochconverter.com 例如,在您的示例中:

1372060916 = Mon, 24 Jun 2013 08:01:56 GMT

我們不知道您何時生成該值,但除非它實際上是在 8:01 am UTC,否則這是您的系統時鍾的問題。

System.currentTimeMillisDate本身中的值都不受時區影響。 但是,您應該知道Date.toString()確實使用了本地時區,這會誤導許多開發人員認為Date與時區有內在關聯——它不是,它只是一個瞬間,沒有關聯的時間區甚至日歷系統。

我可以確認所有三個調用都可能取決於當地時間,考慮到時代,而不是Date.toString()或任何類似的方法。 我已經看到它們依賴於運行 Android 2.3 的特定設備的本地時間。 我還沒有用其他設備和安卓版本測試過它們。 在這種情況下,本地時間是手動設置的。

獲得獨立 UTC 時間的唯一可靠方法是使用GPS_PROVIDER請求位置更新。 NETWORK_PROVIDER檢索到的位置的getTime()值也取決於本地時間。 例如,另一個選項是 ping 返回 UTC 時間戳的服務器。

所以,我做的是以下內容:

public static String getUTCstring(Location location) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    String date = sdf.format(new Date(location.getTime()));
    // Append the string "UTC" to the date
    if(!date.contains("UTC")) {
        date += " UTC";
    }
    return date;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM