所以我一直在研究一个简单的小方法,它会将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
我的问题,你可能已经注意到,首先,时间是错误的。它增加了一个小时。
其次,它将文本字段Mon
和Feb
翻译成ma
和feb
,它们是挪威语的翻译,这是我现在编码的地方。< / p>
我需要将时间作为Calendar
对象返回给我,其方式与this.getCreated_at())
- 字符串的确切方式相同。
我做错了什么?
任何人都可以帮助我吗?
顺便说一下,我来自挪威。那是+01:00标准偏移。
答案 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
所持有的值。