Calendar.getInstance (TimeZone.getTimeZone ("UTC") UTC समय नहीं दे रहा है


106

मैं वास्तव में Calendar.getInstance(TimeZone.getTimeZone("UTC"))विधि कॉल के साथ मिल रहे परिणाम से उलझन में हूं , यह IST समय लौट रहा है।

यहाँ पर मेरे द्वारा उपयोग किया गया कोड है

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

और मुझे जो प्रतिक्रिया मिली वह है:

Sat Jan 25 15:44:18 IST 2014

इसलिए मैंने डिफ़ॉल्ट TimeZone को UTC में बदलने की कोशिश की और फिर मैंने जाँच की, तो यह ठीक काम कर रहा है

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

परिणाम:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

क्या मुझसे कोई चूक हो रही है?

जवाबों:


146

System.out.println(cal_Two.getTime())मंगलाचरण एक रिटर्न Dateसे getTime()। यह वह है Dateजिसके लिए एक स्ट्रिंग में परिवर्तित हो रहा है println, और यह रूपांतरण ISTआपके मामले में डिफ़ॉल्ट टाइमज़ोन का उपयोग करेगा ।

आपको वांछित समय-क्षेत्र में DateFormat.setTimeZone()प्रिंट करने के लिए स्पष्ट रूप से उपयोग करने की आवश्यकता होगी Date

EDIT: @Laurynas के सौजन्य से, इस पर विचार करें:

TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
SimpleDateFormat simpleDateFormat = 
       new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(timeZone);

System.out.println("Time zone: " + timeZone.getID());
System.out.println("default time zone: " + TimeZone.getDefault().getID());
System.out.println();

System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
System.out.println("Default: " + calendar.getTime());

मैं एक पल के लिए यह देख रहा हूँ। शायद शीर्षक पर्याप्त स्पष्ट नहीं है? वैसे, मदद के लिए धन्यवाद
gavard.e

3
यदि आप System.out.println का परिणाम दिखाते हैं तो आप बहुत समय बचा सकते हैं :)
Vasil Valchev

1
मुझे यह मिलता है .. धन्यवाद .. लेकिन मुझे समझ में नहीं आता है कि एक टाइमज़ोन सेटिंग को कैसे सेट करना simpleDateFormat वर्ग की जिम्मेदारी होगी। समयक्षेत्र बदलने से वास्तविक समय बदल जाता है, न कि यह प्रारूप। SimpleDateFormat का काम सिर्फ तारीख को प्रारूपित करना है, समय में फेरबदल नहीं करना है ....
गुस्से में ५


यह (फॉर्मेटर के टाइमज़ोन को सेट करने के लिए) मुझे हर बार मिलता है, भले ही मैंने कैलेंडर का टाइमज़ोन सेट किया हो।
एजी हैमर्थीफ

17

java.util.Dateसमयक्षेत्र से स्वतंत्र है। जब आप प्रिंट करते हैं, cal_Twoहालांकि Calendarउदाहरण को अपना टाइमज़ोन सेट करने के लिए मिला है UTC, cal_Two.getTime()तो वह एक Dateउदाहरण लौटाएगा जिसमें एक टाइमज़ोन नहीं है (और हमेशा डिफ़ॉल्ट टाइमज़ोन में है)

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());

आउटपुट:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 

के जावदोक से TimeZone.setDefault()

TimeZone सेट करता है जिसे getDefault विधि द्वारा लौटाया जाता है। यदि ज़ोन अशक्त है, तो डिफ़ॉल्ट रूप से उस मान को रीसेट करें जो मूल रूप से वीएम ने पहली बार शुरू किया था।

इसलिए, अपने को setDefault()पहले cal_Twoसे त्वरित करने पर आपको सही परिणाम मिलेगा।

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());

आउटपुट:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014

6
Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
calendar.getTimeInMillis()

मेरे लिए काम कर रहा है


5

आप निश्चित रूप से एक छोटी सी बात याद कर रहे हैं और वह यह है कि आप एक डिफ़ॉल्ट मान सेट नहीं कर रहे हैं:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

तो कोड इस तरह दिखेगा:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

स्पष्टीकरण : यदि आप समय क्षेत्र बदलना चाहते हैं, तो डिफ़ॉल्ट समय क्षेत्र का उपयोग करके सेट करेंTimeZone.setDefault()


0
    Following code is the simple example to change the timezone
public static void main(String[] args) {
          //get time zone
          TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Colombo");
          Calendar calendar = new GregorianCalendar();
          //setting required timeZone
          calendar.setTimeZone(timeZone1);
          System.out.println("Time :" + calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));

       }

यदि आप टाइमज़ोन की सूची देखना चाहते हैं, तो यहाँ follwing कोड है

public static void main(String[] args) {

    String[] ids = TimeZone.getAvailableIDs();
    for (String id : ids) {
        System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
    }

    System.out.println("\nTotal TimeZone ID " + ids.length);

}

private static String displayTimeZone(TimeZone tz) {

    long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
    long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                              - TimeUnit.HOURS.toMinutes(hours);
    // avoid -4:-30 issue
    minutes = Math.abs(minutes);

    String result = "";
    if (hours > 0) {
        result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
    } else {
        result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
    }

    return result;

}

-6

के GMTबजाय उपयोग करने का प्रयास करें UTC। वे एक ही समय क्षेत्र का उल्लेख करते हैं, फिर भी नाम GMTअधिक सामान्य है और काम कर सकता है।


GMT का उपयोग करने से समान परिणाम प्राप्त होंगे।
जिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.