如何在Java中正确地从字符串解析为LocalDate?

如何在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。问题是,在运行时,我在断点处暂停,并在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多

我的密码在这里

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
。但考虑到问题中错误消息中嵌入的字符串值,这种情况根本不可能发生。如前所述,问题不清楚,缺少对输入字符串值的解释。我投票结束这个问题,因为它不清楚。