2010-07-29 116 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