Java 使用SimpleDataFormat.parse(“yyyy-MM-dd”)时发生ParseException

Java 使用SimpleDataFormat.parse(“yyyy-MM-dd”)时发生ParseException,java,simpledateformat,date-parsing,parseexception,Java,Simpledateformat,Date Parsing,Parseexception,我的代码如下所示: (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25") 这个参数应该将日期对象传递给构造函数,但我得到了一个ParseException。我试着玩Locale.US和Locale.ENGLISH,运气不好 Eclipse没有向我提供有关ParseException的详细信息,我尝试将区域设置作为SimpleDataFormat声明中的第二个参数 这样做的目的是: Date parameter = (new Sim

我的代码如下所示:

 (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25")
这个参数应该将日期对象传递给构造函数,但我得到了一个ParseException。我试着玩Locale.US和Locale.ENGLISH,运气不好

Eclipse没有向我提供有关ParseException的详细信息,我尝试将区域设置作为SimpleDataFormat声明中的第二个参数

这样做的目的是:

 Date parameter = (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25");
所以我可以调用构造函数:

NewClass newObject = new NewClass(parameter);

但是直接在构造函数调用中创建参数。

让我猜一下:您想给我们一个最小的、完整的和可验证的示例,而不是脱离上下文的生产代码片段。非常好。在您尝试这样做的过程中,您碰巧将示例简化了一点,使其不再可验证。以下代码段确实引发您报告的异常:

    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        Date parameter = dateFormat.parse("0000-12-25");
    } catch (ParseException pe) {
        System.out.println(pe);
    }
输出:

java.text.ParseException:不可解析日期:0000-12-25

这是因为没有第0年。问题中使用的带有默认设置的SimpleDateFormat并不重要,它只提供了第一年CE之前的年份,即公元前一年。然而,一个不宽容的SimpleDataFormat确实关心并抛出了一个异常

让我进一步猜猜,你也不在乎,并且会很高兴得到第一年的前一年

    LocalDate parameter = LocalDate.parse("0000-12-25");
    System.out.println("parameter: " + parameter);
参数:0000-12-25

我打算推荐您使用java.time,这是一种现代的java日期和时间API。这确实使用了0年:1 BCE称为0,2 BCE称为-1,等等。由于日期是ISO 8601格式,现代类默认使用的标准,LocalDate解析字符串时不使用任何显式格式

您需要将日期传递给NewClass构造函数。当然,我的第一个建议是,在NewClass中,您使用现代的LocalDate,而不是旧的、过时的、设计糟糕的日期。然后将上述参数作为构造函数参数传递。如果您不能更改NewClass,或者现在不想更改,还有更好的时间吗?您可以这样转换:

    Instant startOfDay = parameter.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = Date.from(startOfDay);
    System.out.println("parameter as Date: " + oldfashionedDate);
参数日期:周一至十二月27日00:09:40 CET 1


当它打印第1年时,它是公元前1年。Date.toString不打印纪元。糟糕的是,日期突然变差了2天,因为日期和本地日期在历史上的闰年上并不完全一致。我说不出哪个是正确的。

什么是完全例外?还有,你是如何使用语言环境的?还有,你想要什么样的结果?例如,为什么有这么多的括号?似乎对我来说很好。无法重现:请参阅。我甚至试过所有时区。没有错误,所以不是DST问题。没有0年,所以在我看来,你试图做的是胡说八道。不过,在我的Java 10上,您的代码也会运行,并生成一个参数Sat Dec 25 00:00:00 CET 1。没错,第一年,因为没有第0年;可能是公元前1年。我建议你避免使用SimpleDateFormat类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。