Calendar.getInstance (TimeZone.getTimeZone (“UTC”)) không trả về giờ UTC


106

Tôi thực sự bối rối với kết quả tôi nhận được với Calendar.getInstance(TimeZone.getTimeZone("UTC"))cuộc gọi phương thức, nó trả về thời gian IST.

Đây là mã tôi đã sử dụng

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

và câu trả lời tôi nhận được là:

Sat Jan 25 15:44:18 IST 2014

Vì vậy, tôi đã thử thay đổi TimeZone mặc định thành UTC và sau đó tôi kiểm tra, sau đó nó hoạt động tốt

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

Kết quả:

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

Am i thiếu cái gì ở đây?

Câu trả lời:


146

Lời System.out.println(cal_Two.getTime())gọi trả về một Datetừ getTime(). Nó Dateđược chuyển đổi thành chuỗi cho printlnvà chuyển đổi đó sẽ sử dụng ISTmúi giờ mặc định trong trường hợp của bạn.

Bạn cần sử dụng rõ ràng DateFormat.setTimeZone()để in Datemúi giờ mong muốn.

CHỈNH SỬA: Được phép của @Laurynas, hãy xem xét điều này:

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

Tôi đã tìm kiếm cái này trong giây lát. Có lẽ tiêu đề không đủ rõ ràng? Nhân tiện, cảm ơn vì sự giúp đỡ
gavard.e

3
Bạn có thể tiết kiệm rất nhiều thời gian sử dụng nếu hiển thị kết quả của System.out.println :)
Vasil Valchev

1
Tôi hiểu rồi .. cảm ơn .. Nhưng tôi không hiểu cách đặt thiết lập múi giờ sẽ là trách nhiệm của lớp simpleDateFormat. Thay đổi múi giờ sẽ thay đổi thời gian thực, không phải định dạng của nó. Công việc của SimpleDateFormat là chỉ định dạng ngày chứ không phải thao tác thời gian ....
phẫn nộITguy

Câu trả lời hoàn hảo !!
Najib Ahmed Puthawala

Điều này (phải đặt múi giờ của bộ định dạng) luôn khiến tôi thích thú, mặc dù tôi đã đặt múi giờ của lịch.
Agi Hammerthief

17

java.util.Datekhông phụ thuộc vào múi giờ. Khi bạn in cal_Twomặc dù Calendarphiên bản đã được đặt múi giờ UTC, cal_Two.getTime()sẽ trả về một Datephiên bản không có múi giờ (và luôn ở múi giờ mặc định)

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

Đầu ra:

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

Từ javadoc của TimeZone.setDefault()

Đặt TimeZone được trả về bởi phương thức getDefault. Nếu vùng là null, hãy đặt lại mặc định về giá trị mà nó có ban đầu khi máy ảo khởi động lần đầu.

Do đó, di chuyển setDefault()trước đó của bạn cal_Twolà ngay lập tức bạn sẽ nhận được kết quả chính xác.

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

Đầu ra:

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

đang làm việc cho tôi


5

Bạn chắc chắn đang thiếu một điều nhỏ và đó là bạn đang không đặt giá trị mặc định:

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

Vì vậy, mã sẽ giống như sau:

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

Giải thích : Nếu bạn muốn thay đổi múi giờ, hãy đặt múi giờ mặc định bằngTimeZone.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));

       }

nếu bạn muốn xem danh sách múi giờ, đây là mã 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

Cố gắng sử dụng GMTthay vì UTC. Chúng đề cập đến cùng một múi giờ, nhưng tên GMTphổ biến hơn và có thể hoạt động.


Sử dụng GMT sẽ cho kết quả tương tự.
Jim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.