2010-01-19 29 views
7

Hãy xem xét các đoạn mã sau:vấn đề Strange với múi giờ, lịch và SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

Calendar c = Calendar.getInstance(Locale.US); 
c.setTimeInMillis(start); 
System.out.println("Start = " + c.getTime()); 
c.setTimeInMillis(end); 
System.out.println(" End = " + c.getTime()); 

Khi chạy đoạn mã này, tôi có kết quả như sau:

Start = Wed Sep 30 10:30:00 CEST 2009 
    End = Fri Oct 30 10:30:00 CET 2009 

Tại sao tôi nhận múi giờ khác nhau?

Lưu ý rằng nếu tôi thiết lập ngày đầu tiên vào tháng tám và thứ hai trong tháng chín, đầu ra sẽ hiển thị cùng một múi giờ trong cả hai trường hợp:

long start = sdf.parse("10:30:00 30/08/2009").getTime(); 
long end = sdf.parse("10:30:00 30/09/2009").getTime(); 

sẽ hiển thị:

Start = Sun Aug 30 10:30:00 CEST 2009 
    End = Wed Sep 30 10:30:00 CEST 2009 

tôi 'đang sử dụng Java 1.6.0_14

+0

Là nó liên quan đến thời điểm chuyển đổi mùa đông cuối cùng của tháng mười? Nếu có, làm thế nào để thoát khỏi điều này? – romaintaz

+0

Bạn không. Bạn có thể buộc 'CEST' thành' CET' nhưng điều đó sẽ dẫn đến một giờ khác (giờ tháng 10 sẽ là 11:30 thay vì 10:30). Nó giống như GMT (giờ, UTC bây giờ) và Luân Đôn thời gian: khi DST bật, Luân Đôn Thời gian là kỹ thuật GMT + 1, CET là GMT + 2 vv – laura

+0

Chính xác bạn muốn đạt được điều gì? * Tại sao * làm yo nghĩ rằng bạn cần phải thoát khỏi DST? –

Trả lời

9

CEST là Giờ mùa hè Trung Âu. Nó giống như CET với tiết kiệm ánh sáng ban ngày có hiệu lực.

+0

Đó là những gì tôi nghi ngờ, nhưng sau đó làm thế nào tôi có thể thoát khỏi thời gian tiết kiệm ánh sáng ban ngày này? – romaintaz

+0

Tại sao bạn muốn loại bỏ nó? CET là -01: 00 trong khi CEST là -02: 00 (giờ chênh lệch từ giờ GMT, mà không bao giờ tiết kiệm ánh sáng ban ngày). Điều này quy ước cho múi giờ và bạn không nên phá vỡ nó. Chính xác là bạn đang cố đạt được điều gì? Đây có phải là bản trình bày hoặc vấn đề tính toán không? – kgiannakakis

+0

Hiệu chỉnh: CET là +1 và CEST là +2 –

0

Có, nó liên quan đến thời gian tiết kiệm ánh sáng ban ngày. Nếu bạn sử dụng múi giờ nhận dạng DST, nó sẽ tự động được sử dụng. Bạn có thể sử dụng GMT ví dụ nếu bạn không muốn điều này.

6

Bạn có thể đặt múi giờ mặc định

import java.util.TimeZone; 
...   
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // or "Etc/GMT-1" 

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
    long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
    long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

    Calendar c = Calendar.getInstance(Locale.US); 
    c.setTimeInMillis(start); 
    System.out.println("Start = " + c.getTime()); 
    c.setTimeInMillis(end); 
    System.out.println(" End = " + c.getTime()); 

sử dụng TimeZone.getAvailableIDs() để xem tất cả các ID có sẵn.

EDIT: bạn cũng có thể sử dụng một SimpleTimeZone mới

TimeZone.setDefault(new SimpleTimeZone(60 * 60 * 1000, "CET")); 
Các vấn đề liên quan