2010-07-29 40 views
5

Tôi muốn có thời gian UTC cho 01/01/2100 trong Java thành '2100-01-01 00:00:00'. Tôi đang nhận "2100-01-01 00:08:00". Bất kỳ ý tưởng, làm thế nào để sửa lỗi này.Tạo thời gian UTC trong java

public Date getFinalTime() { 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
    Date finalTime = null; 

    try 
    { 
     finalTime = df.parse("01/01/2100");    
    } catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

    calendar.setTime(finalTime); 
    return calendar.getTime(); 
} 

Trả lời

9

Bạn cũng cần chỉ định múi giờ cho SimpleDateFormat - hiện đang phân tích cú pháp nửa đêm giờ địa phương kết thúc bằng 8 giờ tối UTC.

TimeZone utc = TimeZone.getTimeZone("UTC"); 
Calendar calendar = Calendar.getInstance(utc); 

DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
df.setTimeZone(utc); 
Date finalTime = null; 

try 
{ 
    finalTime = df.parse("01/01/2100");    
} catch (ParseException e) 
{ 
    e.printStackTrace(); 
} 

calendar.setTime(finalTime); 

Như mọi khi, tôi khuyên bạn nên sử dụng Joda Time có khả năng nói chung hơn nhiều. Tôi rất vui khi dịch ví dụ của bạn sang Joda Time nếu bạn muốn.

Ngoài ra, tôi thấy bạn đang quay trở lại calendar.getTime() - điều đó cũng giống như trả lại finalTime ngay sau khi bạn tính toán.

Cuối cùng, chỉ cần bắt một số ParseException và tiếp tục như thể nó không xảy ra là một ý tưởng tồi. Tôi hy vọng đây chỉ là mẫu mã và nó không phản ánh phương pháp thực sự của bạn. Tương tự như vậy, tôi giả định rằng thực sự là bạn sẽ phân tích cú pháp một số văn bản khác - nếu không, thì như Eyal đã nói, bạn chỉ nên gọi trực tiếp các phương thức trên Calendar. (Hoặc, một lần nữa, hãy sử dụng Thời gian Joda.)

2

Bạn cũng cần đặt múi giờ của đối tượng SimpleDateFormat, nếu không giả định múi giờ mặc định.

Dù sao, có vẻ như chỉ sử dụng Lịch là đủ trong trường hợp của bạn. Sử dụng các bộ định vị của nó để đặt các giá trị phù hợp cho tất cả các trường (năm, tháng, ngày, giờ, v.v ...), và sau đó lấy lại thời gian.

+0

Nếu OP chỉ có chuỗi là đầu vào, bạn nên sử dụng các lớp dựng sẵn để thực hiện phân tích thay vì tự phân tích cú pháp, phải không? –

+0

@Jon Skeet: Tôi không hiểu từ lời giải thích của anh ta rằng anh ta được đưa ra một chuỗi biến làm đầu vào. Tôi cho rằng đó là một giá trị cố định, phát sinh một số giới hạn thời gian (năm 2100). –

+0

Tôi cho rằng đó chỉ là một mẫu - nếu anh ta không thực sự muốn phân tích văn bản, nó chắc chắn sẽ là lẻ (và sai) để sử dụng SimpleDateFormat. –

Các vấn đề liên quan