2012-06-14 9 views
6

Tôi có một vấn đề lạ với Lịch Gregorian Java:Java GregorianCalendar múi giờ

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S Z"); 
sdf.setTimeZone(TimeZone.getTimeZone("US/Pacific")); 

GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal1.setTimeInMillis(1320566400000L); 

GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal2.setTimeInMillis(1320570000000L); 

System.out.println(sdf.format(cal1.getTime())); 
System.out.println(sdf.format(cal2.getTime())); 

tôi thực thi mã đưa ra ở trên trên một máy với mặc định múi giờ = Mỹ Thái Bình Dương, nhưng máy đang chạy ở Đức.

Kết quả như sau:

2011-11-06 01:00:00:0 -0700 
2011-11-06 01:00:00:0 -0800 

Tôi thực sự không hiểu, tại sao có một múi giờ khác nhau trong kết quả ... Tôi cũng đã thử nghiệm mã trên máy khác (mặc định múi giờ = GMT) và nó hoạt động chính xác.

Có ai đó có ý tưởng không, tại sao vấn đề này xảy ra?

nhất, Michael

+0

Phiên bản Java nào bạn đã sử dụng? ;-) Đôi khi có lỗi trong một phiên bản và không có trong các phiên bản khác. – reporter

+0

Tôi sử dụng Java 1.6. – Michael

Trả lời

5

Thêm những dòng này vào chương trình của bạn:

for (int i=0; i<24; i++) { 
    cal1.add(Calendar.MINUTE, i*5); 
    System.out.println(" : " + sdf.format(cal1.getTime())); 
} 

Và bạn sẽ thấy:

: 2011-11-06 01:00:00:0 -0700 
: 2011-11-06 01:05:00:0 -0700 
: 2011-11-06 01:15:00:0 -0700 
: 2011-11-06 01:30:00:0 -0700 
: 2011-11-06 01:50:00:0 -0700 
: 2011-11-06 01:15:00:0 -0800 
: 2011-11-06 01:45:00:0 -0800 
: 2011-11-06 02:20:00:0 -0800 
: 2011-11-06 03:00:00:0 -0800 

Vì vậy, có vẻ như bạn đang thay đổi thời gian mùa hè đến giờ mùa đông. Múi giờ của tôi là CET (UTC + 01: 00), vì vậy tôi không thể biết lý do múi giờ của tôi hoạt động trên máy thứ hai của bạn.

+0

Cảm ơn thông tin với thời gian tiết kiệm ánh sáng ban ngày. Ở Đức sự thay đổi của thời gian tiết kiệm ánh sáng ban ngày là một tuần sau đó - do đó tôi đã không nghĩ về nó :) – Michael

2

ngày 6 tháng 11 năm 2011 là khi thời gian tiết kiệm ánh sáng ban ngày kết thúc ở Hoa Kỳ. Vì vậy, những gì bạn đang thấy là đồng hồ nhấn 2 giờ sáng ngày 6 tháng 11 và sau đó nó quay trở lại 1 giờ sáng để giảm trở lại một giờ so với thời gian tiêu chuẩn. Vì vậy, bù đắp cũng thay đổi từ -7 đến -8 từ GMT tôi tin cho thời gian Thái Bình Dương. Vì vậy, nó hoạt động chính xác từ những gì tôi có thể nhìn thấy.

0

Vui lòng kiểm tra trong bảng điều khiển của bạn rằng bạn chưa kích hoạt Thời gian mùa hè. Lỗi này có thể là do