Saya ingin mengetahui waktu UTC saat ini dalam milidetik. Saya mencari di google dan mendapatkan beberapa jawaban bahwa System.currentTimeMillis () mengembalikan waktu UTC. tapi ternyata tidak. Jika saya melakukan berikut ini:
long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();
ketiganya hampir sama (perbedaannya dalam mili detik karena panggilan).
t1 = 1372060916
t2 = 1372060917
t3 = 1372060918
dan kali ini bukan waktu UTC melainkan waktu zona waktu saya. Bagaimana saya bisa mendapatkan waktu UTC saat ini di Android?
Jawaban:
Ketiga baris yang Anda tunjukkan akan memberikan jumlah milidetik sejak periode unix, yang merupakan titik waktu tetap, tidak terpengaruh oleh zona waktu lokal Anda.
Anda mengatakan "kali ini bukan waktu UTC" - Saya curiga Anda sebenarnya telah salah mendiagnosisnya. Saya akan menyarankan menggunakan epochconverter.com untuk ini. Misalnya, dalam contoh Anda:
1372060916 = Mon, 24 Jun 2013 08:01:56 GMT
Kami tidak tahu kapan Anda menghasilkan nilai itu, kecuali jika itu sebenarnya pada 8:01 UTC, itu masalah dengan jam sistem Anda.
Baik
System.currentTimeMillis
nilai di dalamDate
dirinya sendiri tidak terpengaruh oleh zona waktu. Namun, Anda harus menyadari bahwaDate.toString()
itu menggunakan zona waktu lokal, yang menyesatkan banyak pengembang untuk berpikir bahwa aDate
terkait erat dengan zona waktu - ini bukan, ini hanya sekejap dalam waktu, tanpa zona waktu terkait atau bahkan sistem kalender.sumber
Date.getTime()
untuk menemukan waktu milidetik-sejak-Unix-epoch, bagi dengan 1000 (karena nama file itu dalam detik sejak zaman Unix) dan cukup format integer itu sebagai string.Saya dapat mengonfirmasi bahwa ketiga panggilan dapat bergantung pada waktu setempat, dengan mempertimbangkan zaman, bukan
Date.toString()
atau yang serupa. Saya telah melihatnya bergantung pada waktu lokal di perangkat tertentu yang menjalankan Android 2.3. Saya belum mengujinya dengan perangkat lain dan versi Android. Dalam kasus ini, waktu lokal telah diatur secara manual.Satu-satunya cara yang dapat diandalkan untuk mendapatkan waktu UTC independen adalah meminta pembaruan lokasi menggunakan
GPS_PROVIDER
. ThegetTime()
nilai lokasi diambil dariNETWORK_PROVIDER
juga tergantung pada waktu setempat. Opsi lainnya adalah melakukan ping ke server yang mengembalikan stempel waktu UTC, misalnya.Jadi, yang saya lakukan adalah sebagai berikut:
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; }
sumber