क्या System.currentTimeMillis () UTC का समय लौटाता है?


93

मैं मिलों में वर्तमान यूटीसी समय प्राप्त करना चाहता हूं। मैंने Google को खोजा और कुछ जवाब मिले कि System.currentTimeMillis () UTC समय देता है। लेकिन ऐसा नहीं है। अगर मैं निम्नलिखित करूं:

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

सभी तीन बार लगभग समान हैं (अंतर कॉल के कारण मिली सेकंड में है)।

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

और यह समय UTC का समय नहीं है, बल्कि यह मेरा समयक्षेत्र समय है। मैं एंड्रॉइड में वर्तमान यूटीसी समय कैसे प्राप्त कर सकता हूं?


4
1 जनवरी, 1970 00:00:00 UTC के बाद से मिलीसेकंड में वर्तमान प्रणाली समय लौटाता है
Blackbelt


3
long t3 = Calendar.getInstance (TimeZone.getTimeZone ("UTC"))। getTimeInMillis ();
ब्लैकबेल्ट

3
उपरोक्त लिंक में कहा गया है कि "कंप्यूटर समय" और समन्वित सार्वभौमिक समय (UTC) के बीच उत्पन्न होने वाली मामूली विसंगतियों की चर्चा के लिए कक्षा तिथि का विवरण देखें। " और java.util.Date प्रलेखन में आप पाते हैं: "हालांकि दिनांक वर्ग समन्वित सार्वभौमिक समय (UTC) को प्रतिबिंबित करने के लिए है, यह जावा वर्चुअल मशीन के मेजबान वातावरण के आधार पर ऐसा बिल्कुल नहीं कर सकता है" -> तो यह हो सकता है संभव है कि आपकी मशीन गैर-यूटीसी समय
लौटे

4
@ g.revolution: 1 जनवरी, 1970 00:00:00 UTC के बाद से "मिलीसेकंड की संख्या" - आप यह कैसे उम्मीद करेंगे कि एक समय क्षेत्र के लिए समायोजित करें? आपका स्थानीय समय क्षेत्र उस युग के बाद से कितने मिलीसेकंड को प्रभावित नहीं करता है।
जॉन स्कीट

जवाबों:


132

आपके द्वारा दिखाई गई सभी तीन पंक्तियाँ यूनिक्स युग के बाद से मिलीसेकंड की संख्या देगी, जो कि एक निश्चित समय है, जो आपके स्थानीय समय क्षेत्र से प्रभावित नहीं है।

आप कहते हैं "यह समय यूटीसी का समय नहीं है" - मुझे संदेह है कि आपने वास्तव में गलत तरीके से निदान किया है। मैं इसके लिए epochconverter.com का उपयोग करने का सुझाव दूंगा । उदाहरण के लिए, आपके उदाहरण में:

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

हमें पता नहीं है कि आपने उस मूल्य को कब उत्पन्न किया है, लेकिन जब तक यह वास्तव में 8:01 बजे यूटीसी नहीं था, यह आपके सिस्टम घड़ी के साथ एक समस्या है।

समय क्षेत्र से न तो अपने आप में System.currentTimeMillisकोई मान Dateप्रभावित होता है। हालाँकि, आपको पता होना चाहिए कि Date.toString() यह स्थानीय समय क्षेत्र का उपयोग करता है , जो कई डेवलपर्स को यह सोचकर भ्रमित करता है कि Dateएक समय क्षेत्र के साथ स्वाभाविक रूप से जुड़ा हुआ है - यह नहीं है, यह सिर्फ एक समय में एक संबंधित समय क्षेत्र या कैलेंडर प्रणाली के बिना है।


6
तो मूल रूप से, यह कहना है कि यह फ़ंक्शन एक ही मान लौटाता है, अगर मेजबान की घड़ी की परवाह किए बिना, अलग-अलग समय क्षेत्रों में एक ही समय में कहा जाता है, सही है?
फिलिप

14
यार इससे मुझे लगता है कि दुनिया एक समय क्षेत्र को अपना सकती है (कर सकती है)। आकाश में बड़ी चमकीली वस्तु दिखाई देने पर घड़ी की संख्या 00:00 या 08:00 है तो कौन परवाह करता है? इस ऐतिहासिक अवशेष पर बर्बाद किए गए अन्यथा उत्पादक समय के अनगिनत घंटे मेरे खून को उबाल देते हैं ...
corsiKa

इससे संबंधित, ध्यान दें कि OS घड़ी फ़ंक्शन में अंतर्निहित कॉल में कई मिलीसेकेंड का 'ड्रिफ्ट' प्रलेखित है। यदि किसी ऑपरेशन की अत्यधिक सटीक अवधि (किसी कार्य के शुरू होने और समाप्त होने का समय समाप्त हो जाता है, तो डेल्टा समय की समाप्ति राशि है) को जावा का एक 'उच्च प्रदर्शन टाइमर' है। देखें: docs.oracle.com/javase/7/docs/api/java/lang/…
Darrell Teague

@JonSkeet अगर toString () आंतरिक रूप से टाइमज़ोन का उपयोग करें तो मैं कैसे टाइमज़ोन के बिना इसे से स्ट्रिंग बना सकता हूं। वास्तव में मैं REST सर्वर में फाइल जेनरेट कर रहा हूं, जिसका नाम आधी रात के समय के पूर्व "1551139200.json" पर फिल्माया गया है (26 फरवरी, 2019 12:00:00 पूर्वाह्न) और डिवाइस के System.currentMillis () में एक बार Android ऐप से पहुंचने की आवश्यकता है सटीक समय देता है।
1919

@kiranking: Date.getTime()मिली-सेकंड-यूनिक्स- एपोच समय को खोजने के लिए उपयोग करें , 1000 से विभाजित करें (जैसा कि फ़ाइल नाम यूनिक्स युग के बाद से सेकंड में है ) और बस एक स्ट्रिंग के रूप में पूर्णांक को प्रारूपित करें।
जॉन स्कीट

3

मैं पुष्टि कर सकता हूं कि सभी तीन कॉल स्थानीय समय पर निर्भर हो सकते हैं, युगांतर को देखते हुए, Date.toString()या इसी तरह की कोई विधि नहीं। मैंने उन्हें एंड्रॉइड 2.3 पर चलने वाले विशिष्ट उपकरणों में स्थानीय समय पर निर्भर देखा है। मैंने अन्य उपकरणों और Android संस्करणों के साथ उनका परीक्षण नहीं किया है। इस मामले में, स्थानीय समय मैन्युअल रूप से निर्धारित किया गया था।

एक स्वतंत्र यूटीसी समय प्राप्त करने का एकमात्र विश्वसनीय तरीका एक स्थान अपडेट का उपयोग करने का अनुरोध करना है GPS_PROVIDERgetTime()स्थान से प्राप्त स्थान का मान NETWORK_PROVIDERस्थानीय समय पर भी निर्भर करता है। एक अन्य विकल्प एक सर्वर को पिंग करना है जो उदाहरण के लिए, यूटीसी टाइमस्टैम्प लौटाता है।

तो, मैं जो कर रहा हूं वह निम्नलिखित है:

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;
}

1
System.currentTimeMillis () एक UTC आधारित मान लौटाता है। ऑपरेटिंग सिस्टम घड़ी की 'सटीकता' या सटीकता का संबंध है, जबकि निश्चित रूप से यह परिणाम को प्रभावित करता है, किसी भी तरह से सिस्टम या जावा पर्यावरण समय-क्षेत्र मूल्य से संबंधित नहीं है।
डेरेल टेग्यूज

@DarrellTeague मैं जोर देता हूं, मैंने एक विशिष्ट Huawei डिवाइस में अलग-अलग मान देखे। तो नहीं, यह हमेशा सही UTC समय (सटीकता के अंतर को
त्यागना

ओपी का प्रश्न जावा क्लास टाइमज़ोन उपयोग के बारे में था। यह हार्डवेयर या लौटे समय मान की सटीकता के बारे में नहीं था। सीधे शब्दों में कहें तो, JVM को अपना (अमूर्त) ऑपरेटिंग "सिस्टम क्लॉक" से मिलता है (जो ऑपरेटिंग सिस्टम द्वारा भिन्न होता है कि यह कैसे कार्य करता है)। यह भी देखें: drdobbs.com/embedded-systems/... और "सी" ऑपरेटिंग सिस्टम पर कार्यान्वयन chemie.fu-berlin.de/chemnet/use/info/libc/libc_17.html
डेरेल Teague
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.