2010-07-29 46 views
5

我想要將Java中01/01/2100的UTC時間設置爲'2100-01-01 00:00:00'。我得到「2100-01-01 00:08:00」。任何想法,如何糾正這一點。用java生成UTC時間

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

回答

9

您還需要指定SimpleDateFormat的時區 - 目前解析午夜當地時間這將以UTC上午8點結束。

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

雖然與以往一樣,我個人推薦使用Joda Time,遠在一般能力更強。如果你願意,我很樂意將你的例子翻譯成喬達時間。

此外,我看到你正在返回calendar.getTime() - 這與你一旦計算出來就返回finalTime一樣。

最後,抓住ParseException並繼續進行,好像它沒有發生是一個非常糟糕的主意。我希望這只是示例代碼,並不反映你真正的方法。同樣,我假設真的是你會解析一些其他文本 - 如果你不是,那麼Eyal說,你應該直接調用Calendar的方法。 (或者,再次使用喬達時間。)

2

您還需要設置SimpleDateFormat對象的時區,否則它將採用默認時區。

無論如何,它似乎只使用一個日曆就足夠你的情況。使用其setter爲所有字段(年,月,日,小時等)設置正確的值,然後檢索時間。

+0

如果OP只有一個字符串作爲輸入,那麼使用內置類進行解析而不是自己解析它是有意義的,不是嗎? – 2010-07-29 19:52:29

+0

@Jon Skeet:我不明白他的解釋,他給了一個變量字符串作爲輸入。我認爲這是一個固定的價值,可以規定一些時間限制(2100年)。 – 2010-07-29 19:57:36

+0

我認爲這只是一個示例 - 如果他實際上不想解析文本,那麼使用SimpleDateFormat肯定會是奇怪的(也是錯誤的)。 – 2010-07-29 21:21:40