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

时间:2018-07-24 01:14:07

标签: java simpledateformat date-parsing parseexception

我的代码如下:

 (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25")

该参数应该将日期对象传递给构造函数,但是我得到了ParseException。我试过和Locale.USLocale.ENGLISH玩耍,没有运气。

Eclipse没有提供有关ParseException的详细信息,我尝试将Locale作为SimpleDateFormat声明中的第二个参数。

想法是得到这个:

 Date parameter = (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25");

所以我可以调用一个构造函数:

NewClass newObject = new NewClass(parameter);

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

1 个答案:

答案 0 :(得分:3)

让我猜测:您想给我们一个最小,完整和可验证的示例,而不是上下文中的生产代码片段。确实很好。在尝试这样做时,您碰巧使该示例有点太小了,因此不再可验证。以下代码片段确实引发了您报告的异常:

    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无关紧要,只是给我们提供了公元1年(即公元1年)之前的年份。宽容的SimpleDateFormat确实会在意并引发异常。

让我进一步猜测,您也不在乎,很高兴在第一年获得升学。

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

参数:0000-12-25

无论如何,我本来建议您使用java.time(现代的Java日期和时间API)。而且确实使用了年份零:1 BCE被称为0,2 BCE被称为-1,依此类推。由于您的日期采用ISO 8601格式,因此现代类将其用作默认标准,LocalDate会解析您的日期没有任何显式格式化程序的字符串。

您需要将日期传递给NewClass构造函数。我的第一个建议当然是在NewClass中也使用现代的LocalDate,而不是旧的,过时且设计不良的Date。然后只需将上面的parameter作为构造函数参数即可。如果您无法更改NewClass或不想立即更改(还有更好的时间吗?),可以这样进行转换:

    Instant startOfDay = parameter.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = Date.from(startOfDay);
    System.out.println("parameter as Date: " + oldfashionedDate);
  

参数作为日期:1月12日星期一00:09:40 CET 1

当打印第一年时,它是公元前1年。 Date.toString不打印时代。哎呀,日期突然过了2天,因为DateLocalDate对于距今很远的leap年没有100%的共识。我说不对。