Calendar.getInstance (TimeZone.getTimeZone (“UTC”)) tidak mengembalikan waktu UTC


106

Saya benar-benar bingung dengan hasil yang saya dapatkan dengan Calendar.getInstance(TimeZone.getTimeZone("UTC"))pemanggilan metode, ini mengembalikan waktu IST.

Ini kode yang saya gunakan

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

dan tanggapan yang saya dapatkan adalah:

Sat Jan 25 15:44:18 IST 2014

Jadi saya mencoba mengubah TimeZone default ke UTC dan kemudian saya periksa, lalu berfungsi dengan baik

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

Hasil:

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

Apakah saya melewatkan sesuatu di sini?

Jawaban:


146

The System.out.println(cal_Two.getTime())doa mengembalikan Datedari getTime(). Ini adalah Dateyang akan diubah menjadi string println, dan konversi itu akan menggunakan ISTzona waktu default dalam kasus Anda.

Anda harus menggunakan secara eksplisit DateFormat.setTimeZone()untuk mencetak Datedi zona waktu yang diinginkan.

EDIT: Atas kebaikan @Laurynas, pertimbangkan ini:

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

Saya sudah mencari ini sebentar. Mungkin judulnya kurang eksplisit? Omong-omong, terima kasih atas bantuannya
gavard.e

3
Anda dapat menghemat banyak waktu jika Anda menampilkan hasil dari System.out.println :)
Vasil Valchev

1
Saya mengerti .. terima kasih .. Tapi saya tidak mengerti bagaimana mengatur pengaturan zona waktu akan menjadi tanggung jawab kelas simpleDateFormat. Mengubah zona waktu mengubah waktu sebenarnya, bukan formatnya. Tugas SimpleDateFormat adalah hanya memformat tanggal, bukan memanipulasi waktu ....
angryITguy

Jawaban Sempurna !!
Najib Ahmed Puthawala

Ini (harus menyetel zona waktu pemformat) membuat saya setiap saat, meskipun saya menyetel zona waktu kalender.
Agi Hammerthief

17

java.util.Datetidak bergantung pada zona waktu. Ketika Anda mencetak cal_Twomeskipun Calendarinstance telah menyetel zona waktunya ke UTC, cal_Two.getTime()akan mengembalikan Dateinstance yang tidak memiliki zona waktu (dan selalu dalam zona waktu default)

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

Keluaran:

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

Dari javadoc dari TimeZone.setDefault()

Menyetel TimeZone yang dikembalikan oleh metode getDefault. Jika zona adalah null, setel ulang default ke nilai semula saat VM pertama kali dimulai.

Karenanya, memindahkan setDefault()sebelum cal_TwoAnda dipakai, Anda akan mendapatkan hasil yang benar.

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

Keluaran:

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

bekerja untuk saya


5

Anda pasti kehilangan satu hal kecil dan itu adalah Anda tidak menetapkan nilai default:

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

Jadi kodenya akan terlihat seperti:

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

Penjelasan : Jika Anda ingin mengubah zona waktu, setel zona waktu default menggunakanTimeZone.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));

       }

Jika Anda ingin melihat daftar zona waktu, berikut adalah kode berikut

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

Coba gunakan, GMTbukan UTC. Mereka mengacu pada zona waktu yang sama, namun namanya GMTlebih umum dan mungkin berfungsi.


Menggunakan GMT akan menghasilkan hasil yang sama.
Jim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.