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类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。