我的代码如下:
(new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25")
该参数应该将日期对象传递给构造函数,但是我得到了ParseException。我试过和Locale.US
和Locale.ENGLISH
玩耍,没有运气。
Eclipse没有提供有关ParseException的详细信息,我尝试将Locale作为SimpleDateFormat声明中的第二个参数。
想法是得到这个:
Date parameter = (new SimpleDateFormat("yyyy-MM-dd")).parse("0000-12-25");
所以我可以调用一个构造函数:
NewClass newObject = new NewClass(parameter);
但是直接在构造函数调用中创建参数。
答案 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天,因为Date
和LocalDate
对于距今很远的leap年没有100%的共识。我说不对。