如何在Java中正确地从字符串解析为LocalDate?
我面临一个奇怪的问题。我无法将字符串值解析为LocalDate。问题是,在运行时,我在断点处暂停,并在evaluate expression tool中执行解析,结果它工作了。但我继续申请,我得到了下一个条款的例外: 原因:java.time.format.DateTimeParseException:无法在索引11处分析文本'-218906870-0-9088-15635' 位于java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 位于java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) at java.time.LocalDate.parse(LocalDate.java:400) 位于com.library.controller.CrudController.returnBook(CrudController.java:96) ... 55多 我的密码在这里如何在Java中正确地从字符串解析为LocalDate?,java,date,string-parsing,localdate,Java,Date,String Parsing,Localdate,我面临一个奇怪的问题。我无法将字符串值解析为LocalDate。问题是,在运行时,我在断点处暂停,并在evaluate expression tool中执行解析,结果它工作了。但我继续申请,我得到了下一个条款的例外: 原因:java.time.format.DateTimeParseException:无法在索引11处分析文本'-218906870-0-9088-15635' 位于java.time.format.DateTimeFormatter.parseResolved0(DateTime
LocalDate date = returnDatePicker.getValue();
Journal item = (Journal) tableView.getSelectionModel().getSelectedItem();
if(date != null && item != null) {
LocalDate itemDate = LocalDate.parse(item.getStartDate().toString());
if (date.isAfter(itemDate)) {
journalDao.saveOrUpdate(item.withReturnDate(date));
returnPanel.setDisable(true);
fillJournal();
}
}
字符串值中的日期类似于“2017-12-30”。
一些屏幕截图:
这怎么可能呢?它在evaluate中工作,在运行时不工作。
如果您能给我一些提示,我将不胜感激。将
java.util.Date
转换为String
,然后将该字符串解析为LocalDate
可能不是将Date
转换为LocalDate
的最佳方式
尝试以下操作(详细解释),看看是否可以解决问题:
Date startDate = item.getStartDate();
ZoneId zoneId = ZoneId.systemDefault(); // Or ZoneId.of( "Europe/Moscow" ) etc.
LocalDate itemDate = startDate.toInstant().atZone( zoneId ).toLocalDate();
LocalDate.parse()正常工作,“-218906870-0-9088-15635”很明显,您正在尝试将其解析为日期,这就是它引发异常的原因。@GCP它在LocalDate-itemDate=LocalDate.parse(item.getStartDate().toString()行上引发异常;我调试了parse方法,发现它在解析过程中抛出异常。但我不明白。为什么它不在计算表达式工具中抛出异常,而是在运行时抛出异常。当我们不知道
item.getStartDate()返回什么值时,我们甚至不知道它的类型,我们只能蒙着眼睛猜测。可以吗?正确,调用Date::toString
是错误的方法。java.util.Date
是UTC格式。不幸的是,toString
的实现动态地应用JVM的当前默认时区。因此,根据你在地球上的位置,你可以得到三个可能的日期中的任何一个,跨越时区的时间间隔至少为26小时。因此,确定日期绝对需要一个时区。永远不要调用Date::toString
,始终要立即转换为java.time.Instant
,正如这个答案中正确显示的那样,Date::toInstant
。鉴于无法解析的文本是-218906870-0-9088-15635
,它几乎不是来自Date.toString()
@OleV.V>。你是对的,我和这个答案的作者都假设涉及java.util.Date
。但考虑到问题中错误消息中嵌入的字符串值,这种情况根本不可能发生。如前所述,问题不清楚,缺少对输入字符串值的解释。我投票结束这个问题,因为它不清楚。