Calendar.getInstance (TimeZone.getTimeZone (“UTC”)) UTC saatini döndürmüyor


106

Calendar.getInstance(TimeZone.getTimeZone("UTC"))Metot çağrısıyla aldığım sonuçla gerçekten kafam karıştı, IST zamanı geri geliyor.

İşte kullandığım kod

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

ve aldığım yanıt:

Sat Jan 25 15:44:18 IST 2014

Bu yüzden varsayılan Zaman Dilimini UTC olarak değiştirmeyi denedim ve sonra kontrol ettim, sonra iyi çalışıyor

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

Sonuç:

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

Burada bir şey mi kaçırıyorum?

Yanıtlar:


146

System.out.println(cal_Two.getTime())Çağırma bir döner Dategelen getTime(). Bu, Dateiçin bir dizeye dönüştürülendir printlnve bu dönüşüm, ISTsizin durumunuzda varsayılan saat dilimini kullanır .

İstenen saat diliminde DateFormat.setTimeZone()yazdırmak için açıkça kullanmanız gerekir Date.

DÜZENLEME: @Laurynas'ın izniyle, şunu düşünün:

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());

Bir süredir bunu arıyordum. Belki başlık yeterince açık değildir? Bu arada, yardım için teşekkürler
gavard.e

3
System.out.println sonucunu gösterirseniz çok fazla zaman harcayabilirsiniz :)
Vasil Valchev

1
Bunu anlıyorum .. teşekkürler .. Ama bir saat dilimi ayarının nasıl basitDateFormat sınıfının sorumluluğu olacağını anlamıyorum. Saat dilimini değiştirmek, biçimini değil gerçek saati değiştirir. SimpleDateFormat'ın işi sadece tarihi biçimlendirmek, saati değiştirmek değil ....
angryITguy

Mükemmel cevap !!
Najib Ahmed Puthawala

Bu (biçimlendiricinin saat dilimini ayarlamak zorunda), takvimin saat dilimini ayarlamama rağmen beni her seferinde alıyor.
Agi Hammerthief

17

java.util.Datesaat diliminden bağımsızdır. Yazdırmak zaman cal_Twoolsa Calendarörneği olan zaman dilimi seti var UTC, cal_Two.getTime()bir dönecekti Datebir saat dilimi yoktur örneği (ve varsayılan saat diliminde her zaman)

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

Çıktı:

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

Javadoc'dan TimeZone.setDefault()

GetDefault yöntemi tarafından döndürülen TimeZone'u ayarlar. Bölge boşsa, varsayılanı sanal makine ilk başladığında sahip olduğu değere sıfırlayın.

Bu nedenle, sizin hareketli setDefault()önce cal_Twoörneği doğru sonucu elde edersiniz.

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());

Çıktı:

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()

benim için çalışıyor


5

Kesinlikle küçük bir şeyi kaçırıyorsunuz ve bu, varsayılan bir değer belirlemiyorsunuz:

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

Yani kod şöyle görünecektir:

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

Açıklama : Saat dilimini değiştirmek isterseniz, varsayılan saat dilimini kullanarak ayarlayın.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));

       }

saat dilimlerinin listesini görmek istiyorsanız, aşağıdaki kod.

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

GMTBunun yerine kullanmayı deneyin UTC. Aynı saat dilimine atıfta bulunurlar, ancak ad GMTdaha yaygındır ve işe yarayabilir.


GMT'yi kullanmak aynı sonuçları verecektir.
Jim,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.