मैं जावा में यूटीसी या जीएमटी में वर्तमान तिथि और समय कैसे प्राप्त कर सकता हूं?


479

जब मैं एक नई Dateवस्तु बनाता हूं , तो इसे वर्तमान समय में लेकिन स्थानीय समय क्षेत्र में शुरू किया जाता है। मैं GMT में वर्तमान दिनांक और समय कैसे प्राप्त कर सकता हूं?


मुझे पता है कि इस प्रकार के विषय पूरी तरह से चर्चा में हैं, लेकिन मैंने पाया कि कॉमन्स-लैंग पैकेज वास्तव में इन सामान्य जावा मुद्दों को अच्छी तरह से संभालता है। commons.apache.org/lang/api-2.5/org/apache/commons/lang/time उनके पास मौजूद विभिन्न पैकेज देखें।

आप कौन सा स्थानीय समय चाहते हैं, और किस सटीकता के साथ। अधिकांश टाइमज़ोन को यूटीसी के सापेक्ष एसआई सेकंड में मापा गया ऑफसेट के साथ परिभाषित किया गया है, लेकिन जीएमटी का संबंध जो सौर अवलोकन पर आधारित है और (थोड़ा) चर लंबाई दूसरी अधिक जटिल है। दोनों में 0.9 सेकंड तक अंतर होता है।
mc0e

1
एक Dateएक समय क्षेत्र पकड़ नहीं है, तो "लेकिन स्थानीय समय क्षेत्र में" (सबसे अच्छे रूप में या गलत) सही नहीं है देखें। Java.util.Date के बारे में सभी
ओले वी.वी.

जवाबों:


409

java.util.Dateकोई विशिष्ट समय क्षेत्र नहीं है, हालांकि इसका मूल्य UTC के संबंध में सबसे अधिक सोचा जाता है। क्या आपको लगता है कि यह स्थानीय समय में है?

सटीक होने के लिए: एक के भीतर मूल्य java.util.Dateयूनिक्स युग के बाद से मिलीसेकंड की संख्या है, जो 1 जनवरी 1970 की आधी रात को, यूटीसी। समान काल को अन्य समय क्षेत्रों में भी वर्णित किया जा सकता है, लेकिन पारंपरिक वर्णन यूटीसी के संदर्भ में है। चूंकि यह एक निश्चित अवधि के बाद से कई मिलीसेकंड का है, इसलिए java.util.Dateस्थानीय समय क्षेत्र की परवाह किए बिना, दुनिया भर में मूल्य समान है।

मुझे संदेह है कि आप इसे कैलेंडर के एक उदाहरण के माध्यम से प्रदर्शित कर रहे हैं जो स्थानीय समय-क्षेत्र का उपयोग करता है, या संभवत: Date.toString()जिसका उपयोग करके स्थानीय समय-क्षेत्र का उपयोग करता है, या एक SimpleDateFormatउदाहरण, जो डिफ़ॉल्ट रूप से, स्थानीय समय-क्षेत्र का भी उपयोग करता है।

यदि यह समस्या नहीं है, तो कृपया कुछ नमूना कोड पोस्ट करें।

हालाँकि, मैं आपको सलाह दूंगा कि आप वैसे भी जोडा-टाइम का उपयोग करें , जो कि अधिक स्पष्ट एपीआई प्रदान करता है।


5
फिर वह शायद ड्राइवर का मसला है। आपको अपना कनेक्शन UTC, या कुछ इस तरह सेट करना पड़ सकता है। मैंने पहले भी इस तरह की समस्याएं देखी हैं, लेकिन समस्या java.util.Date में नहीं है।
जॉन स्कीट

13
Behrang, stackoverflow.com/questions/4123534/… के अनुसार , MySQL JDBC ड्राइवर किसी दिए गए java.util.Timestamp(या java.util.Date) को सर्वर टाइम ज़ोन में परिवर्तित करता है ।
डेरेक महार

5
@श्री। बिल्ली: आप यह कैसे निर्धारित कर रहे हैं? क्या यह लिखने से है System.out.println(new Date())? यदि हां, तो आपको पता होना चाहिए कि यह वह toString()विधि है जो वहां समय क्षेत्र को लागू कर रही है ... यदि ऐसा नहीं है, तो कृपया अधिक जानकारी दें।
जॉन स्कीट

8
@KanagaveluSugumar: toString()हमेशा डिफ़ॉल्ट समय क्षेत्र का उपयोग करता है। date.getTime()यूटीसी में यूनिक्स युग के बाद से निश्चित रूप से मिलीसेकंड देता है। यह कहना सबसे सटीक है कि Dateअपने आप में एक समय क्षेत्र नहीं है - यह समय में सिर्फ एक पल है, जिसे कई समय क्षेत्रों में माना जा सकता है। लेकिन जब आप एक उदाहरण बनाते हैं, तो यह आपके समय क्षेत्र पर निर्भर नहीं करता है।
जॉन स्कीट

6
@Jemenake: वास्तव में ऐसा तब नहीं हुआ था, जब ग्रीनविच में आधी रात थी, क्योंकि उस समय ब्रिटेन UTC + 1 पर था। इतिहास के अजीब बिट्स में से सिर्फ एक। लेकिन मैं आपकी बात लेता हूं - यह कहना बेहतर है कि "नई तारीख ()। गेटटाइम () यूनिक्स युग के बाद मिलीसेकंड लौटाता है, जो 1 जनवरी 1970, यूटीसी की शुरुआत में आधी रात थी।" इसलिए UTC समय में एक विशेष पल के लिए युग को कम करने का हिस्सा है, परिणाम का हिस्सा नहीं है।
जॉन स्कीट

323

tl; डॉ

Instant.now()   // Capture the current moment in UTC. 

उस मूल्य का प्रतिनिधित्व करने के लिए एक स्ट्रिंग उत्पन्न करें:

Instant.now().toString()  

2016-09-13T23: 30: 52.123Z

विवरण

के रूप में जॉन स्कीट द्वारा सही जवाब में कहा गया है, एक java.util.Date वस्तु है कोई समय क्षेत्र । लेकिन इसका toStringकार्यान्वयन उस तिथि-समय मान के स्ट्रिंग प्रतिनिधित्व को उत्पन्न करते समय JVM के डिफ़ॉल्ट समय क्षेत्र पर लागू होता है। भोले-भाले प्रोग्रामर के साथ डेट करने से लगता है कि एक टाइम ज़ोन है लेकिन ऐसा नहीं है।

java.util.Date, j.u.Calendar, और java.text.SimpleDateFormatजावा के साथ बंडल कक्षाएं बेहद परेशानी में हैं। इनसे बचें। इसके बजाय, इन सक्षम तिथि-समय पुस्तकालयों में से किसी एक का उपयोग करें:

java.time (जावा 8)

Java 8 एक उत्कृष्ट नया java.time लाता है । * पुराने java.util.Date/Calendar कक्षाओं को दबाने के लिए पैकेज

UTC / GMT में वर्तमान समय प्राप्त करना एक सरल ...

Instant instant = Instant.now();

यही कारण है कि Instantवर्ग java.time में मूल निर्माण खंड, में समय रेखा पर एक पल का प्रतिनिधित्व करता है यूटीसी के एक संकल्प के साथ नैनोसेकंड

जावा 8 में, वर्तमान क्षण केवल मिलीसेकंड रिज़ॉल्यूशन तक कैप्चर किया गया है। जावा 9Clock आपके मेजबान कंप्यूटर की क्लॉक हार्डवेयर की क्षमता के आधार पर, इस वर्ग की पूर्ण नैनोसेकंड क्षमता में वर्तमान क्षण को कैप्चर करता है।

यह toStringविधि एक विशिष्ट आईएसओ 8601 प्रारूप का उपयोग करके अपने मूल्य का एक स्ट्रिंग प्रतिनिधित्व उत्पन्न करती है । वह प्रारूप शून्य, तीन, छह या नौ अंकों के अंक ( मिलीसेकंड , माइक्रोसेकंड , या नैनोसेकंड ) को अंश-दूसरे का प्रतिनिधित्व करने के लिए आवश्यक के रूप में आउटपुट करता है।

यदि आप अधिक लचीला स्वरूपण, या अन्य अतिरिक्त सुविधाएँ चाहते हैं, तो UTC के लिए ( ZoneOffset.UTCनिरंतर ) a को प्राप्त करने के लिए ऑफ़सेट-यूटीटी ऑफ़ ज़ीरो लागू करें OffsetDateTime

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );

सांत्वना दें…

System.out.println( "now.toString(): " + now );

जब चला…

now.toString(): 2014-01-21T23:42:03.522Z

जावा में तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत।


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तारों की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

जावा या एंड्रॉइड के किस संस्करण के साथ उपयोग करने के लिए java.time लाइब्रेरी की तालिका

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


Joda समय

अद्यतन: जोडा-टाइम परियोजना, अब रखरखाव मोड में , java.time कक्षाओं में प्रवासन की सलाह देती है ।

का उपयोग करते हुए Joda समय मुक्त के- लागत 3 तीय-पक्ष खुला स्रोत पुस्तकालय, आप कोड की केवल एक पंक्ति में वर्तमान दिनांक समय मिल सकता है।

Joda-Time ने नए java.time को प्रेरित किया। * जावा 8 में कक्षाएं, लेकिन एक अलग वास्तुकला है। आप जावा के पुराने संस्करणों में जोडा-टाइम का उपयोग कर सकते हैं। Joda-Time जावा 8 में काम करना जारी रखता है और सक्रिय रूप से बनाए रखा जाता है (2014 के अनुसार)। हालाँकि, Joda- टाइम टीम java.time को माइग्रेशन की सलाह देती है।

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

अधिक विस्तृत उदाहरण कोड (Joda-Time 2.3)…

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );

सांत्वना दें…

System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );

जब चला…

Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z

टाइम ज़ोन काम करने वाले अधिक उदाहरण कोड के लिए, एक समान प्रश्न के लिए मेरा उत्तर देखें ।

समय क्षेत्र

मैं आपको हमेशा जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र (जो किसी भी समय कर सकता हूं!) पर निर्भर होने के बजाय एक समय क्षेत्र निर्दिष्ट करने की सलाह देता हूं। इस तरह की निर्भरता समय-काल के काम में भ्रम और बग का एक सामान्य कारण लगती है।

जब कॉलिंग now()वांछित / अपेक्षित समय क्षेत्र को सौंपा जाए। DateTimeZoneकक्षा का उपयोग करें ।

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );

वह वर्ग UTC समय क्षेत्र के लिए एक स्थिरांक रखता है ।

DateTime now = DateTime.now( DateTimeZone.UTC );

यदि आप वास्तव में जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र का उपयोग करना चाहते हैं, तो एक स्पष्ट कॉल करें ताकि आपका कोड स्व-दस्तावेजीकरण हो।

DateTimeZone zoneDefault = DateTimeZone.getDefault();

आईएसओ 8601

आईएसओ 8601 प्रारूपों के बारे में पढ़ें । Java.time और Joda-Time दोनों उस मानक समझदार प्रारूप का उपयोग करते हैं जो दोनों को पार्स करने और उत्पन्न करने के लिए उनकी चूक के रूप में उपयोग करता है।


वास्तव में, java.util.Date करता है एक समय क्षेत्र, स्रोत कोड की परतों के नीचे गहरे दफन है। अधिकांश व्यावहारिक उद्देश्यों के लिए, उस समय क्षेत्र की उपेक्षा की जाती है। तो, शॉर्टहैंड के रूप में, हम कहते हैं java.util.Date का कोई समय क्षेत्र नहीं है। इसके अलावा, उस दफन समय क्षेत्र तारीख की विधि द्वारा इस्तेमाल नहीं किया गया है toString; यह विधि JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र का उपयोग करती है। इस भ्रामक वर्ग से बचने और जोडा-टाइम और java.time के साथ रहने के लिए सभी और अधिक कारण।


2
DateTime.now().toDateTime(DateTimeZone.UTC)मैं क्या देख रहा था! धन्यवाद!
मानगाराम

1
@ मैनगर्म आप इसे छोटा कर सकते हैं: DateTime nowUtc = DateTime.now ( DateTimeZone.UTC ) ;
बेसिल बोर्ख

शुद्ध जावा 8 2014-01-21T15:34:29.933-08:00को आपके द्वारा उपयोग किए गए उदाहरण में कैसे प्राप्त करेंnew org.joda.time.DateTime()
GOXR3PLUS

1
@ GOXR3PLUS ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) ).truncatedTo( ChronoUnit.MILLIS ).toOffsetDateTime().toString() हमें एक निर्दिष्ट समय क्षेत्र के लिए वर्तमान क्षण मिलता है। इसके बाद, किसी भी माइक्रो / नैनो को बंद करें। तब हम पूर्ण-विकसित समय क्षेत्र (अतीत, वर्तमान का इतिहास, और भविष्य के परिवर्तनों का उपयोग करते हैं) के बजाय केवल ऑफ़सेट-से-यूटीसी (घंटे-मिनट-सेकंड की) होने में परिवर्तित करते हैं। विशेष क्षेत्र)। अंत में, हम OffsetDateTimeमानक आईएसओ 8601 प्रारूप में मान का प्रतिनिधित्व करते हुए पाठ का निर्माण करते हैं जो डिफ़ॉल्ट रूप से इसकी toStringविधि में उपयोग किया जाता है ।
बेसिल बॉर्क

यह विस्तृत विवरण देने के लिए धन्यवाद, एंड्रॉइड के लिए +1 भी सपोर्ट करता है :) @BasilBourque
mochadwi

271
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));

//Local time zone   
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

//Time in GMT
return dateFormatLocal.parse( dateFormatGmt.format(new Date()) );

11
आप dateFormatLocal के साथ dateFormatGmt प्रारूप का उपयोग करने के बाद पार्स क्यों करते हैं ... इसे पढ़ने से कोई मतलब नहीं है। मुझे यकीन है कि यह काम करता है, लेकिन सिर्फ सोच रहा है?
माइंडवायर

2
setTimeZone ने ऐसा किया (मुझे लगता है कि आप getTimeZone ("UTC") GMT जैसी ही चीज़ का भी उपयोग कर सकते हैं?
rogerdpack

6
लेकिन समय डिवाइस सेट समय पर निर्भर है। यदि उपयोगकर्ता ने अपने डिवाइस पर गलत समय निर्धारित किया है, तो आपको गलत यूटीसी मिलेगा। गलत होने पर मुझे सही करें
बसवराज हम्पली

@ बासवराजहम्पली लेकिन आज की दुनिया में अधिकांश उपकरण इंटरनेट से जुड़े हुए हैं जो गलत समय को सही करते हैं
अक्षत अग्रवाल

3
समन्वित यूनिवर्सल टाइम (UTC) और ग्रीनविच मीन टाइम (GMT) के बीच कोई समय का अंतर नहीं है
सुस्ती

86

यह निश्चित रूप से UTC समय देता है: स्ट्रिंग और दिनांक ऑब्जेक्ट के रूप में!

static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

public static Date getUTCdatetimeAsDate() {
    // note: doesn't check for null
    return stringDateToDate(getUTCdatetimeAsString());
}

public static String getUTCdatetimeAsString() {
    final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    final String utcTime = sdf.format(new Date());

    return utcTime;
}

public static Date stringDateToDate(String StrDate) {
    Date dateToReturn = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);

    try {
        dateToReturn = (Date)dateFormat.parse(StrDate);
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return dateToReturn;
}

मेरे जवाब में मैं यह बताना भूल गया कि DATEFORMAT को कैसे परिभाषित किया गया है: static final String DATEFORMAT = "yyyy-MM-dd HH:mm:ss";
कोई व्यक्ति कहीं-कहीं

21
कृपया जावा में अपरकेस के साथ विधि नाम शुरू करने से बचें। विधि नामों के लिए जावा कोडिंग कन्वेंशन देखें ।
फ्लोरियन शॉफनर

2
जैसा कि इस उत्तर पर पुनर्निर्देशित किया गया है new Date(), यदि डिवाइस का समय गलत है, तो कॉलिंग कभी भी सही यूटीसी समय नहीं लौटाएगा।
सानूप

क्या इस पद्धति को डिवाइस कैलेंडर पर निर्भर होने का समय मिलता है?
अर्नोल्ड ब्राउन

एक बात ध्यान दें। किसी भी समाधान को UTC में एक दिनांक या टाइमस्टैम्प प्राप्त करने की आवश्यकता होती है, ऐसा लगता है कि कुंजी SimpleDateFormat का फिर से उपयोग नहीं करना है, बल्कि UTC को स्ट्रिंग में लाने के लिए एक का उपयोग करें, फिर स्ट्रिंग को किसी दिनांक में परिवर्तित करते समय एक और UTC बनाएं। या टाइमस्टैम्प ऑब्जेक्ट। मैंने देखा कि यदि आप एक ही SimpleDateFormat का पुन: उपयोग करने का प्रयास करते हैं, तो परिणामी दिनांक / टाइमस्टैम्प ऑब्जेक्ट UTC के बजाय स्थानीय समय क्षेत्र में वापस आ जाएगा।
ब्रायन बेगुन

65
    Calendar c = Calendar.getInstance();
    System.out.println("current: "+c.getTime());

    TimeZone z = c.getTimeZone();
    int offset = z.getRawOffset();
    if(z.inDaylightTime(new Date())){
        offset = offset + z.getDSTSavings();
    }
    int offsetHrs = offset / 1000 / 60 / 60;
    int offsetMins = offset / 1000 / 60 % 60;

    System.out.println("offset: " + offsetHrs);
    System.out.println("offset: " + offsetMins);

    c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
    c.add(Calendar.MINUTE, (-offsetMins));

    System.out.println("GMT Time: "+c.getTime());

52

वास्तव में समय नहीं है, लेकिन इसका प्रतिनिधित्व बदला जा सकता है।

SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));

समय पृथ्वी के किसी भी बिंदु में समान है, लेकिन स्थान के आधार पर समय के बारे में हमारी धारणा अलग हो सकती है।


हां, अच्छा और साफ समाधान। यह सिर्फ मुझे चिंता करता है, अगर इसका अप्रभावी केवल कैलेंडर उदाहरण प्राप्त करने के बजाय एक नई दिनांक ऑब्जेक्ट बनाना है?
बेमो

यह JVM द्वारा अनुकूलित किया जाएगा और हॉटस्पॉट सबसे प्रभावी x86 कोड को निष्पादित करेगा
एंटोनियो

17

कैलेंडर aGMTCalendar = Calendar.getInstance (TimeZone.getTimeZone ("GMT")); फिर aGMTCalendar ऑब्जेक्ट का उपयोग करके किए गए सभी ऑपरेशन GMT टाइम ज़ोन के साथ किए जाएंगे और इसमें डेलाइट सेविंग टाइम या फिक्स्ड ऑफ़सेट लागू नहीं होंगे

गलत!

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
aGMTCalendar.getTime(); //or getTimeInMillis()

तथा

Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));aNotGMTCalendar.getTime();

उसी समय लौटेगा। के लिए Idem

new Date(); //it's not GMT.

17

यह कोड वर्तमान समय UTC को प्रिंट करता है।

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;


public class Test
{
    public static void main(final String[] args) throws ParseException
    {
        final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        f.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(f.format(new Date()));
    }
}

परिणाम

2013-10-26 14:37:48 UTC

14

यह एंड्रॉइड में यूटीसी मिलीसेकंड प्राप्त करने के लिए काम करता है।

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;

7
केवल आपको ऑफसेट को घटाना होगा?
टेवच

c.add(Calendar.MILLISECOND, (-utcOffset))utc टाइमज़ोन के साथ कैलेंडर प्राप्त करने के लिए
Shanasas M

10

जॉन स्कीट के उत्तर में यह गलत प्रतीत होता है । उसने कहा:

java.util.Dateहमेशा यूटीसी में है। क्या आपको लगता है कि यह स्थानीय समय में है? मुझे लगता है कि समस्या यह है कि आप इसे कैलेंडर के एक उदाहरण के माध्यम से प्रदर्शित कर रहे हैं जो स्थानीय समय क्षेत्र का उपयोग करता है, या संभवतः Date.toString()जो स्थानीय समय क्षेत्र का भी उपयोग करता है।

हालाँकि, कोड:

System.out.println(new java.util.Date().getHours() + " hours");

जीटीटी (यूटीसी घंटे) नहीं, Calendarऔर नहीं का उपयोग करके स्थानीय घंटे देता हैSimpleDateFormat

इसीलिए लगता है कि कुछ गलत है।

प्रतिक्रियाओं को एक साथ रखते हुए, कोड:

System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
                           .get(Calendar.HOUR_OF_DAY) + " Hours");

स्थानीय घंटों के बजाय GMT घंटे दिखाता है - ध्यान दें कि getTime.getHours()गायब है क्योंकि इससे एक Date()ऑब्जेक्ट बन जाएगा, जो सैद्धांतिक रूप से GMT में तारीख संग्रहीत करता है, लेकिन स्थानीय समय क्षेत्र में घंटे वापस देता है।


6
मैंने पहले इसका उत्तर नहीं देखा था, लेकिन यदि आप पदावनत Date.getHours()विधि के लिए प्रलेखन पढ़ते हैं , तो यह बहुत स्पष्ट करता है: "लौटाया गया मान एक संख्या है (23 के माध्यम से) उस दिन के भीतर घंटे का प्रतिनिधित्व करता है जिसमें शामिल है या इसके साथ शुरू होता है स्थानीय समय क्षेत्र में व्याख्या की गई इस दिनांक वस्तु द्वारा प्रदर्शित समय में तुरंत । " (जोर मेरा।) यह वह getHours()विधि है जो स्थानीय समय क्षेत्र के भीतर मूल्य की व्याख्या करती है - यह Dateस्वयं वस्तु की स्थिति का हिस्सा नहीं है।
जॉन स्कीट

2
जैसा कि जॉन स्कीट ने सही ढंग से कहा, एक java.util.Date ऑब्जेक्ट का कोई समय क्षेत्र नहीं है । लेकिन भ्रामक रूप से, तरीके toStringऔर getHoursउनके उत्पादन के लिए डिफ़ॉल्ट समय क्षेत्र लागू होते हैं। इसलिए, भोले-भाले प्रोग्रामर्स को आसानी से बेवकूफ बना दिया जाता है क्योंकि ऐसा लगता है कि किसी डेट का टाइम ज़ोन है लेकिन वास्तव में ऐसा नहीं है।
बेसिल बोर्के

7

आप यूटीसी के लिए समायोजित क्षेत्रों के साथ एक तिथि वस्तु चाहते हैं तो आप के साथ इस तरह यह कर सकते हैं Joda समय :

import org.joda.time.DateTimeZone;
import java.util.Date;

...

Date local = new Date();
System.out.println("Local: " + local);
DateTimeZone zone = DateTimeZone.getDefault();
long utc = zone.convertLocalToUTC(local.getTime(), false);
System.out.println("UTC: " + new Date(utc));

1
आप बहुत मेहनत कर रहे हैं। कोड के एक लाइन में जोडा-टाइम ऐसा कर सकते हैं। इस सवाल पर मेरा अपना जवाब देखिए । .toDateTimeविधि को कॉल करें और UTC समय क्षेत्र के लिए स्थिरांक पास करें।
बासिल बोर्के

1
डेटटाइम utcDate = new DateTime () .DateTime (DateTimeZone.UTC)
Maciej Miklas

6

आप उपयोग कर सकते हैं:

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

फिर aGMTCalendar ऑब्जेक्ट का उपयोग करके किए गए सभी ऑपरेशन GMT टाइम ज़ोन के साथ किए जाएंगे और इसमें डेलाइट सेविंग टाइम या लागू किए गए ऑफ़सेट्स नहीं होंगे। मुझे लगता है कि पिछला पोस्टर सही है कि दिनांक () ऑब्जेक्ट हमेशा एक जीएमटी देता है जब तक कि आप उस दिनांक ऑब्जेक्ट के साथ कुछ करने के लिए नहीं जाते हैं जो स्थानीय समय क्षेत्र में परिवर्तित हो जाता है।


6
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(date));

कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें, यह इतने सारे अन्य उत्तरों से कैसे भिन्न है?
अक्जोशी

क्या इस पद्धति को डिवाइस कैलेंडर पर निर्भर होने का समय मिलता है?
अर्नोल्ड ब्राउन

6

आप सीधे इसका उपयोग कर सकते हैं

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");

5

साथ में:

Calendar cal = Calendar.getInstance();

फिर calवर्तमान दिनांक और समय है।
आपको वर्तमान समय और समय भी मिल सकता है:

Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));

आप cal.get(Calendar.DATE);दूसरों के विवरण के बारे में लगातार या अन्य कैलेंडर पूछ सकते हैं ।
दिनांक और टाइमस्टैम्प जावा में पदावनत हैं। कैलेंडर वर्ग यह नहीं है।


6
डेट और टाइमस्टैम्प के कुछ तरीकों और निर्माणों को हटा दिया गया है, लेकिन कक्षाएं स्वयं नहीं हैं।
पॉवरलॉर्ड

5

यहाँ एक GMT टाइमस्टैम्प वस्तु पाने के लिए एक अन्य सुझाव:

import java.sql.Timestamp;
import java.util.Calendar;

...

private static Timestamp getGMT() {
   Calendar cal = Calendar.getInstance();
   return new Timestamp(cal.getTimeInMillis()
                       -cal.get(Calendar.ZONE_OFFSET)
                       -cal.get(Calendar.DST_OFFSET));
}

5

यहां स्ट्रिंग प्रारूप में जीएमटी समय प्राप्त करने का एक और तरीका है

String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z" ;
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String dateTimeString =  sdf.format(new Date());

5

यहाँ मेरे toUTC का कार्यान्वयन है:

    public static Date toUTC(Date date){
    long datems = date.getTime();
    long timezoneoffset = TimeZone.getDefault().getOffset(datems);
    datems -= timezoneoffset;
    return new Date(datems);
}

इसे सुधारने के कई तरीके हैं, लेकिन यह मेरे लिए काम करता है।


3

एक विशिष्ट समय क्षेत्र और एक विशिष्ट प्रारूप में सिस्टम समय प्रदान करने के लिए नमूना कोड।

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class TimZoneTest {
    public static void main (String[] args){
        //<GMT><+/-><hour>:<minutes>
        // Any screw up in this format, timezone defaults to GMT QUIETLY. So test your format a few times.

        System.out.println(my_time_in("GMT-5:00", "MM/dd/yyyy HH:mm:ss") );
        System.out.println(my_time_in("GMT+5:30", "'at' HH:mm a z 'on' MM/dd/yyyy"));

        System.out.println("---------------------------------------------");
        // Alternate format 
        System.out.println(my_time_in("America/Los_Angeles", "'at' HH:mm a z 'on' MM/dd/yyyy") );
        System.out.println(my_time_in("America/Buenos_Aires", "'at' HH:mm a z 'on' MM/dd/yyyy") );


    }

    public static String my_time_in(String target_time_zone, String format){
        TimeZone tz = TimeZone.getTimeZone(target_time_zone);
        Date date = Calendar.getInstance().getTime();
        SimpleDateFormat date_format_gmt = new SimpleDateFormat(format);
        date_format_gmt.setTimeZone(tz);
        return date_format_gmt.format(date);
    }

}

उत्पादन

10/08/2011 21:07:21
at 07:37 AM GMT+05:30 on 10/09/2011
at 19:07 PM PDT on 10/08/2011
at 23:07 PM ART on 10/08/2011

3

बस इस सरल बनाने के लिए Date, UTCआप का उपयोग कर सकते हैं बनाने के लिए Calendar:

Calendar.getInstance(TimeZone.getTimeZone("UTC"));

जो Calendar"यूटीसी" का उपयोग करने के लिए एक नया उदाहरण का निर्माण करेगा TimeZone

यदि आपको Dateउस कैलेंडर से किसी ऑब्जेक्ट की आवश्यकता है जिसका आप उपयोग कर सकते हैं getTime()


5
इस पर गेटटाइम () कॉल करने से समय क्षेत्र की जानकारी खो जाती है और स्थानीय समय वापस आ जाता है।
RealCasually

3

UTC में वर्तमान दिनांक समय परिवर्तित करना:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

DateTimeZone dateTimeZone = DateTimeZone.getDefault(); //Default Time Zone

DateTime currDateTime = new DateTime(); //Current DateTime

long utcTime = dateTimeZone.convertLocalToUTC(currDateTime .getMillis(), false);

String currTime = formatter.print(utcTime); //UTC time converted to string from long in format of formatter

currDateTime = formatter.parseDateTime(currTime); //Converted to DateTime in UTC

1
आप यहां बहुत काम कर रहे हैं। (ए) आपके द्वारा परिभाषित फॉर्मैटर पैटर पहले से ही डिफ़ॉल्ट रूप से डेटटाइम में बनाया गया है; toStringउस आईएसओ 8601 को प्राप्त करने के लिए सिर्फ डेटटाइम पर कॉल करें स्ट्रिंग पैटर्न । (बी) समय क्षेत्रों के बीच परिवर्तित करने के लिए बहुत अधिक कोड। बस "toDateTime" को कॉल करें और टाइम ज़ोन ऑब्जेक्ट पास करें। इस तरह myDateTime.toDateTime( DateTimeZone.UTC ):। एक विशिष्ट समय क्षेत्र के लिए, एक उचित नाम , कॉल के आधार पर एक समय क्षेत्र ऑब्जेक्ट को तुरंत और पास करें myDateTime.toDateTime( DateTimeZone.forID( "Asia/Tehran" ) )
बेसिल बॉर्क

2

यह मेरे लिए काम किया, GMT में टाइमस्टैम्प लौटाता है!

    Date currDate;
    SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
    dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

    long currTime = 0;
    try {

        currDate = dateFormatLocal.parse( dateFormatGmt.format(new Date()) );
        currTime = currDate.getTime();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

2

ऑनलाइन एनटीपी सर्वर से कभी भी सही यूटीसी समय प्राप्त करने के लिए इस क्लास का उपयोग करें:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


class NTP_UTC_Time
{
private static final String TAG = "SntpClient";

private static final int RECEIVE_TIME_OFFSET = 32;
private static final int TRANSMIT_TIME_OFFSET = 40;
private static final int NTP_PACKET_SIZE = 48;

private static final int NTP_PORT = 123;
private static final int NTP_MODE_CLIENT = 3;
private static final int NTP_VERSION = 3;

// Number of seconds between Jan 1, 1900 and Jan 1, 1970
// 70 years plus 17 leap days
private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;

private long mNtpTime;

public boolean requestTime(String host, int timeout) {
    try {
        DatagramSocket socket = new DatagramSocket();
        socket.setSoTimeout(timeout);
        InetAddress address = InetAddress.getByName(host);
        byte[] buffer = new byte[NTP_PACKET_SIZE];
        DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);

        buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);

        writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET);

        socket.send(request);

        // read the response
        DatagramPacket response = new DatagramPacket(buffer, buffer.length);
        socket.receive(response);          
        socket.close();

        mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);            
    } catch (Exception e) {
      //  if (Config.LOGD) Log.d(TAG, "request time failed: " + e);
        return false;
    }

    return true;
}


public long getNtpTime() {
    return mNtpTime;
}


/**
 * Reads an unsigned 32 bit big endian number from the given offset in the buffer.
 */
private long read32(byte[] buffer, int offset) {
    byte b0 = buffer[offset];
    byte b1 = buffer[offset+1];
    byte b2 = buffer[offset+2];
    byte b3 = buffer[offset+3];

    // convert signed bytes to unsigned values
    int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);
    int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);
    int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);
    int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);

    return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3;
}

/**
 * Reads the NTP time stamp at the given offset in the buffer and returns 
 * it as a system time (milliseconds since January 1, 1970).
 */    
private long readTimeStamp(byte[] buffer, int offset) {
    long seconds = read32(buffer, offset);
    long fraction = read32(buffer, offset + 4);
    return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L);        
}

/**
 * Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900
 */    
private void writeTimeStamp(byte[] buffer, int offset) {        
    int ofs =  offset++;

    for (int i=ofs;i<(ofs+8);i++)
      buffer[i] = (byte)(0);             
}

}

और इसके साथ प्रयोग करें:

        long now = 0;

        NTP_UTC_Time client = new NTP_UTC_Time();

        if (client.requestTime("pool.ntp.org", 2000)) {              
          now = client.getNtpTime();
        }

यदि आपको DateTCString उपयोग फ़ंक्शन के रूप में UTC समय "अभी" चाहिए:

private String get_UTC_Datetime_from_timestamp(long timeStamp){

    try{

        Calendar cal = Calendar.getInstance();
        TimeZone tz = cal.getTimeZone();

        int tzt = tz.getOffset(System.currentTimeMillis());

        timeStamp -= tzt;

        // DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
        DateFormat sdf = new SimpleDateFormat();
        Date netDate = (new Date(timeStamp));
        return sdf.format(netDate);
    }
    catch(Exception ex){
        return "";
     }
    } 

और इसके साथ प्रयोग करें:

String UTC_DateTime = get_UTC_Datetime_from_timestamp(now);

सिंगल लाइन में <br/> <pre> <code> Calendar utcTime = Calendar.getInstance ()। Add। / कोड>
हारुन

1
हां, लेकिन यह स्थानीय डिवाइस टाइम को कॉल करता है, जो उपयोगकर्ता से मैन्युअल रूप से एक गलत तारीख में बदल सकता है
Ingo


1

सरल करने के लिए। एक कैलेंडर ऑब्जेक्ट समय क्षेत्र के बारे में जानकारी संग्रहीत करता है, लेकिन जब आप cal.getTime () करते हैं तो समयक्षेत्र जानकारी खो जाएगी। तो Timezone रूपांतरण के लिए मैं DateFormat कक्षाओं का उपयोग करने की सलाह दूंगा ...


1

यह मेरा कार्यान्वयन है:

public static String GetCurrentTimeStamp()
{
    Calendar cal=Calendar.getInstance();
    long offset = cal.getTimeZone().getOffset(System.currentTimeMillis());//if you want in UTC else remove it .
    return new java.sql.Timestamp(System.currentTimeMillis()+offset).toString();    
}

1

यदि आप तारीख को पार्स करने से बचना चाहते हैं और GMT में टाइमस्टैम्प चाहते हैं, तो आप उपयोग कर सकते हैं:

final Date gmt = new Timestamp(System.currentTimeMillis()
            - Calendar.getInstance().getTimeZone()
                    .getOffset(System.currentTimeMillis()));

0

यदि आप joda time का उपयोग कर रहे हैं और अपने स्थानीय ऑफसेट के बिना मिलीसेकंड में वर्तमान समय चाहते हैं तो आप इसका उपयोग कर सकते हैं:

long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());

0
public class CurrentUtcDate 
{
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println("UTC Time is: " + dateFormat.format(date));
    }
}

आउटपुट:

UTC Time is: 22-01-2018 13:14:35

आप आवश्यकतानुसार दिनांक प्रारूप को बदल सकते हैं।


1
कृपया लंबे पुराने और कुख्यात परेशानियों का उपयोग करने के लिए युवाओं को न सिखाएं SimpleDateFormat। आज हमारे पास java.timeआधुनिक जावा तिथि और समय एपीआई में इतना बेहतर है । इसके अलावा आप क्या प्रदान कर रहे हैं जो पहले से ही डैन, एंटोनियो और अन्य लोगों के जवाब में नहीं है।
ओले वीवी

2
(ए) यह उत्तर मौजूदा उत्तर के दर्जनों से अधिक मूल्य कैसे जोड़ता है? (b) यहाँ उपयोग किए जाने वाले कष्टप्रद वर्गों को आधुनिक java.time कक्षाओं द्वारा वर्षों पहले दबा दिया गया था । 2018 में उनके उपयोग का सुझाव देना खराब सलाह है।
il:

0

Java.time पैकेज का उपयोग करें और नीचे कोड शामिल करें-

ZonedDateTime now = ZonedDateTime.now( ZoneOffset.UTC );

या

LocalDateTime now2 = LocalDateTime.now( ZoneOffset.UTC );

आपके आवेदन की जरूरत पर निर्भर करता है


(ए) यदि ZoneOffsetसमय क्षेत्र ( ZoneId) के बजाय एक ऑफसेट ( ) का उपयोग कर रहा है , तो OffsetDateTimeअधिक उपयुक्त है ZonedDateTime। (बी) का LocalDateTimeउपयोग वर्तमान क्षण पर कब्जा करने के लिए नहीं किया जाना चाहिए क्योंकि इसमें समय क्षेत्र या ऑफसेट-यूटीसी की कोई अवधारणा नहीं है। (सी) अन्य पूर्व-मौजूदा उत्तरों ने इस सामग्री को कवर किया है और बेहतर काम किया है। मैं यह नहीं देखता कि यह उत्तर कैसे मूल्य जोड़ता है।
बेसिल बोर्के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.