Java中的Calendar对象,返回错误的时间?

时间:2014-02-10 19:01:34

标签: java string time calendar

所以我一直在研究一个简单的小方法,它会将String作为Calendar对象返回。

这就是我所拥有的:

Calendar cal = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH);

try {
    cal.setTime(sdf.parse(this.getCreated_at()));
}
catch (ParseException e) {
    e.printStackTrace();
}

return cal;

现在假设从String获得的this.getCreated_at())始终采用所需的格式,理论上这应该可以完美地运作。

只有一次小打嗝。

假设this.getCreated_at())返回Mon Feb 10 18:52:54 +0000 2014。应该不是问题吧?格式正确,一切。

但是,当我使用main方法时,请执行以下操作:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");

System.out.println(sdf.format(... ... ....stringToCalendar().getTime())); 

它给了我以下输出:

ma feb 10 19:52:54 +0100 2014

我的问题,你可能已经注意到,首先,时间是错误的。它增加了一个小时。

其次,它将文本字段MonFeb翻译成mafeb,它们是挪威语的翻译,这是我现在编码的地方。< / p>

我需要将时间作为Calendar对象返回给我,其方式与this.getCreated_at()) - 字符串的确切方式相同。

我做错了什么?

任何人都可以帮助我吗?

顺便说一下,我来自挪威。那是+01:00标准偏移。

2 个答案:

答案 0 :(得分:5)

  

我的问题,你可能已经注意到,首先,时间是错误的。它增加了一个小时。

不,没有。并不是的。它显示完全相同的时间,但在您当地的时区。很遗憾,您无法轻松确定原始时区,因为DateFormat.parse会返回Date,但不包含任何时区信息。 (在这种情况下,你真的不知道全时区 - 你只知道UTC偏移,这不是一回事。)

编辑:正如Joni的回答所指出的那样,DateFormat.parse 似乎以格式的日历保留原始信息;你不会想要时区,但你可以使用Calendar对象中存储的偏移量。就我个人来说,这似乎是一个我不想依赖的实现细节(特别是当你最终得到一个偏移时,同一个日历对象中的时区不一定支持!)但你如果你真的想要,可以破坏它。

  

其次,它将文本字段Mon和Feb翻译成ma和feb,它们是挪威语的翻译,这是我现在编码的地方。

那是因为您的SimpleDateFormat正在使用您的默认语言区域。

您可以非常轻松地修复此部分:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy",
    Locale.ENGLISH);

如果您知道您想要使用的时区,您也可以在SimpleDateFormat上指定。否则,你将会遇到稍微困难的时间。

我建议你开始使用Joda Time。这样你就可以将值解析为DateTime,它“知道”它所在的时区 - 所以你可以根据需要重新格式化它,保留相关的时区信息。

示例Joda时间码:

import java.util.*;
import org.joda.time.*;
import org.joda.time.format.*;

class Test {
    public static void main(String[] args) {        
        DateTimeFormatter format = DateTimeFormat
            .forPattern("EEE MMM dd HH:mm:ss Z yyyy")
            .withLocale(Locale.ENGLISH);

        String input = "Mon Feb 10 18:52:54 +0000 2014";

        DateTime value = format.parseDateTime(input);
        System.out.println(format.print(value));
    }
}

答案 1 :(得分:-1)

您可以从日期格式获取Calendar实例:

sdf.parse(this.getCreated_at());
Calendar parsed = sdf.getCalendar();

此实例的字段设置为已解析的内容:UTC时区,时间18:52:54等...

很遗憾,似乎无法使用Calendar格式化SimpleDateFormat所持有的值。