Calendar.getInstance (TimeZone.getTimeZone (“ UTC”)) ไม่ส่งคืนเวลา UTC


107

ฉันสับสนมากกับผลลัพธ์ที่ฉันได้รับจาก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

ฉันขาดอะไรที่นี่?

คำตอบ:


148

System.out.println(cal_Two.getTime())ภาวนาส่งกลับจากDate getTime()มันเป็นDateซึ่งเป็นที่ได้รับการแปลงเป็นสตริงหาprintlnและการแปลงที่จะใช้ค่าเริ่มต้นISTเขตเวลาในกรณีของคุณ

คุณจะต้องใช้อย่างชัดเจนDateFormat.setTimeZone()เพื่อพิมพ์Dateในเขตเวลาที่ต้องการ

แก้ไข: ได้รับความอนุเคราะห์จาก @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 คือเพียงแค่จัดรูปแบบวันที่ไม่ใช้เวลา ....
angryITguy

ตอบโจทย์เป๊ะ !!
Najib Ahmed Puthawala

สิ่งนี้ (ต้องตั้งเขตเวลาของฟอร์แมตเตอร์) ทำให้ฉันได้รับทุกครั้งแม้ว่าฉันจะตั้งเขตเวลาของปฏิทิน
Agi Hammerthief

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] 

จาก javadoc ของ TimeZone.setDefault()

ตั้งค่า TimeZone ที่ส่งคืนโดยเมธอด getDefault หากโซนเป็นโมฆะให้รีเซ็ตค่าเริ่มต้นเป็นค่าเดิมเมื่อ VM เริ่มทำงานครั้งแรก

ดังนั้นการย้าย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));

       }

หากคุณต้องการดูรายชื่อเขตเวลานี่คือรหัสต่อไปนี้

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 จะให้ผลลัพธ์เดียวกัน
จิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.