2015-07-21 88 views
1

好吧,這可能是基本的,但不幸的是我還沒有找到任何幫助。在Android中獲取準確的UTC時間

我希望某些功能僅在特定於UTC/GMT時間的時間範圍內發生在Android中。

你是如何做到這一點的?我嘗試使用System.currentTimeMillis(),但如果您在設置中更改Android設備上的時間,這也會更改System.currentTimeMillis()。

我想抓住一個等於UTC/GMT的時間並且與Android設備設置時鐘無關,所以如果設備上的時鐘發生改變,它將不會發生干擾。

有什麼想法?

謝謝! Christopher Steven

+0

您可以設置在程序啓動可以試試這個:http://stackoverflow.com/questions/308683/how-can-i-get-the-current-date-and-time-in-utc-or-gmt-in-java/6697884#6697884 –

+0

@cgomezmendez感謝您的建議,但不幸的是它不工作;我只是在一個示例應用程序中測試它...如果您更改設備時間,這也會改變。 – chocospaz

+0

這個:[谷歌-SntpClient的從網絡獲取utc](http://stackoverflow.com/questions/14771223/get-utc-date-from-web-in-android-application) –

回答

2

time.nist.gov是你的朋友,如果你想有一個真正準確的時間。*

   String TIME_SERVER = "time.nist.gov"; 
       NTPUDPClient timeClient = new NTPUDPClient(); 
       InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); 
       TimeInfo timeInfo = timeClient.getTime(inetAddress); 
       NtpV3Packet message = timeInfo.getMessage(); 

       //get the utc long from the server 
       long serverTime = message.getTransmitTimeStamp().getTime(); 

(一定要捆綁這一切都在一個線程,如果你運行在Android上!)

一,我喜歡做的事情是把服務器的時間和系統時間之間的差異,並存儲,對於未來的使用。總之,只要系統時間沒有擺弄,你就不必多次打電話。您可以花費系統時間並根據差異進行更改。

*您將需要apache commons才能正常工作。

+0

謝謝你的想法!在某些時候,我知道我需要做一個後端請求,我可以讓服務器在服務器端的一個頭文件中傳遞服務器時間,存儲該服務器時間,並將其與經過的時間進行比較 – chocospaz

0

System.nanoTime()返回自啓動以來的納秒數,因此不易受系統時鐘變化影響。

在啓動時使用:

long startTime = System.TimeInMillis(); 
long nanoToDeduct = System.nanoTime(); 

然後在任何時間點,你可以得到程序的當前時間的時鐘與

long currentTime = startTime - timeToDeduct + System.nanoTime();