所以,我正在尝试Java中的Calendar
类,我正在编写一个返回Calendar对象的方法。
我想要的方法是返回包含Calendar
的{{1}}对象。
现在我(可辩解地)不是懒惰,我已经对我的方法做了一些工作。
"Sun Feb 09 22:49:36 +0000 2014"
问题是它一直告诉我,我有一个 Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss Z yyyy");
try {
cal.setTime(sdf.parse("Sun Feb 09 22:49:36 +0000 2014"));
} catch (ParseException e) {
e.printStackTrace();
}
return cal;
,它是ParseException
。
我认为我的逻辑非常正确,但我开始怀疑它。
我更喜欢它而不导入"Unparseable date"
,但Calendar
似乎也非常方便。
越少越好,我总是说。
任何人都能看到我想要的是什么?
编辑1
尝试在main方法中运行代码并打印出结果,但在Exception中没有区别。
以下是我的主要内容:
SimpleDateFormat
对于那些感兴趣的人,以下是主要崩溃后的整个控制台文本:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class TestingMyCalendar {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss Z yyyy");
try {
cal.setTime(sdf.parse("Sun Feb 09 22:49:36 +0000 2014"));
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(cal);
}
}
答案 0 :(得分:4)
您可能需要将默认语言环境设置为Locale.ENGLISH
,否则解析器可能会在星期日Sun
上窒息。
尝试:
Locale.setDefault(Locale.ENGLISH);
或者,将其指定为构造函数调用的一部分:
SimpleDateFormat sdf = new SimpleDateFormat( "EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH);
答案 1 :(得分:2)
您的stacktrace表示Europe/Berlin
,因为时区暗示您使用的是德语Locale
。日期或月份字段可能与您的默认语言环境不匹配,请尝试
SimpleDateFormat sdf =
new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH);
答案 2 :(得分:2)
其他答案都是正确的。我会添加一些想法。
日期工作中最常见的麻烦来源可能是无意中依赖:
我得出结论,两者都应该在我的所有代码中指定,作为一种习惯。如果碰巧使用不同的时区或语言环境设置运行,我不希望我的代码改变其行为(或打破,如你的情况)。
日期时间代码应使用默认值的唯一情况是您真正想要检测并利用用户(JVM)自己的本地化设置。即使在这种情况下,我明确地调用检索并使用默认值而不是依赖隐式默认值,以便使我的代码显而易见并自我记录。
正如评论者所说,尽量减少进口确实是一个奇怪的目标。特别是对于java.util.Calendar和java.util.Date - 如果有一个导入的情况,它将是那两个类。它们是出了名的麻烦,应该避免。使用Joda-Time。或者,在Java 8中,使用由java.time.* package定义的Joda-Time启发的捆绑新JSR 310。
请注意,在Joda-Time中,DateTime对象确实知道自己指定的时区。这与java.util.Date形成鲜明对比,后者没有分配时区,但toString
应用了JVM的默认时区,这导致了很多混乱。
以下是Joda-Time 2.3中的一些示例代码。
String input = "Sun Feb 09 22:49:36 +0000 2014";
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "EEE MMM dd HH:mm:ss Z yyyy" ).withLocale( Locale.ENGLISH ).withZone( timeZone );
DateTime dateTime = formatter.parseDateTime( input );
转储到控制台...
System.out.println( "dateTime: " + dateTime );
System.out.println( "Same dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );
跑步时......
dateTime: 2014-02-09T17:49:36.000-05:00
Same dateTime in UTC/GMT: 2014-02-09T22:49:36.000Z