【问题标题】:Calendar class in Java, ParseExceptionJava 中的日历类,ParseException
【发布时间】:2014-02-09 23:05:55
【问题描述】:

所以,我正在尝试使用 Java 中的 Calendar 类,并且正在编写一个返回 Calendar 对象的方法。

我想要的方法是返回一个包含"Sun Feb 09 22:49:36 +0000 2014"Calendar 对象。

现在我(有争议地)并不懒惰,我已经在我的方法上做了一些工作。

    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,我更喜欢它,但SimpleDateFormat 似乎也很方便。

我总是说,进口越少越好。

有人知道我想要的东西是如何实现的吗?

编辑 1

尝试在main方法中运行代码,只打印出结果,与Exception没有区别。

以下是我的主要内容:

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

}
}

对于那些感兴趣的人,以下是我在主崩溃后的整个控制台文本:

java.text.ParseException: Unparseable date: "Sun Feb 09 22:49:36 +0000 2014"
at java.text.DateFormat.parse(Unknown Source)
at TestingMyCalendar.main(TestingMyCalendar.java:15)
java.util.GregorianCalendar[time=1391987659892,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2014,MONTH=1,WEEK_OF_YEAR=7,WEEK_OF_MONTH=2,DAY_OF_MONTH=10,DAY_OF_YEAR=41,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=14,SECOND=19,MILLISECOND=892,ZONE_OFFSET=3600000,DST_OFFSET=0]

【问题讨论】:

  • 我运行了代码,没有异常
  • 进口越少越好,这是当今世界非常奇怪的座右铭。
  • @baba 哈哈,是的,我猜很奇怪。将其视为临时座右铭,仅适用于此方法!
  • 刚刚测试了您的代码,也没有异常,运行良好。

标签: java calendar simpledateformat


【解决方案1】:

您可能需要将默认语言环境设置为 Locale.ENGLISH,否则解析器可能会在周日阻塞 Sun

试试:

Locale.setDefault(Locale.ENGLISH);

或者,将其指定为构造函数调用的一部分:

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

【讨论】:

  • 啊,Local.ENGLISH 是我需要的黄金代码。非常感谢您的回答!你先回答了,所以你得到了正确的答案。
【解决方案2】:

您的堆栈跟踪指示Europe/Berlin,因为时区表明您使用的是德语Locale。日期或月份字段可能与您的默认语言环境中的字段不匹配,请尝试

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

【讨论】:

  • 非常感谢您提供的信息,您的回答很有帮助!你有我的感激之情!
  • 我实际上不是德国人(不知道我的电脑是如何犯这个错误的),而是快速翻译,并为您提供“Besten Dank”!
【解决方案3】:

其他答案都是正确的。我会补充一些想法。

默认设置很棘手

日期时间工作中最常见的问题来源可能是无意中依赖于:

我得出的结论是,作为一种习惯,应该在我的所有代码中指定这两者。如果我的代码碰巧在不同的时区或语言环境设置下运行,我不希望我的代码改变它的行为(或破坏,如你的情况)。

日期时间代码应该使用默认值的唯一情况是当您真正想要检测和利用用户(JVM)自己的本地化设置时。即使在这种情况下,我也会显式调用来检索和使用默认值,而不是依赖隐式默认值,以使我的代码显而易见并且可以自我记录。

乔达时间

正如评论者所说,最小化您的进口确实是一个奇怪的目标。尤其是 java.util.Calendar 和 java.util.Date——如果有导入的案例,那就是这两个类。它们是出了名的麻烦,应该避免。使用Joda-Time。或者,在 Java 8 中,使用捆绑的新 java.time.* package,受 Joda-Time 的启发,由 JSR 310 定义。

请注意,在 Joda-Time 中,DateTime 对象真正知道自己分配的时区。这与没有指定时区但其toString 应用 JVM 的默认时区的 java.util.Date 形成鲜明对比,这会导致很多混乱。

这是 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

【讨论】:

  • 关于隐式使用默认值的危险的非常有用的评论。
  • 哇。这是非常有见地的阅读。谢谢你,让我的思维更开阔了一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多