如果未定义 HH:mm:ss,如何创建默认为午夜的 ZonedDateTime?

dwj*_*ton 5 java datetime java-8

这就是我想做的:

public ZonedDateTime getZdt(String myDate, String format) {
    return  ZonedDateTime.parse(
                myDate,   
                DateTimeFormatter.ofPattern(format)
                    .withZone(ZoneId.systemDefault())
            );
}

getZdt("17-05-2017 00:10:59", "dd-MM-yyyy HH:mm:ss") //works fine
getZdt("17-05-2017", "dd-MM-yyyy") //DateTimeParseException (...Unable to obtain LocalTime from TemporalAccessor:) 
Run Code Online (Sandbox Code Playgroud)

我想做的事情非常简单。我该如何让它发挥作用?

Ole*_*.V. 2

我为你提供了三点建议。

\n\n

首先,这必须是相同的方法吗?可以要两个吗?我假设你只有两种可能的格式;如果你有十个,我认为这是一个不同的故事。

\n\n
/** gets a ZonedDateTime from a date string with no time information */\npublic ZonedDateTime getZdtFromDateString(String myDate, String format) {\n    return LocalDate.parse(myDate, DateTimeFormatter.ofPattern(format))\n            .atStartOfDay(ZoneId.systemDefault());\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,您可以省略该format参数并使格式保持不变。

\n\n

当然,您可以通过单一方法获得您想要的东西。我建议您的方法不要将格式传递给方法,而是自行检测它。

\n\n

DateTimeFormatter一种选择是处理两种格式的自定义:

\n\n
private static final DateTimeFormatter format = new DateTimeFormatterBuilder().appendPattern("dd-MM-uuuu")\n        .optionalStart()\n        .appendPattern(" HH:mm:ss")\n        .optionalEnd()\n        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)\n        .toFormatter();\n\npublic ZonedDateTime getZdt(String myDate) {\n    return LocalDateTime.parse(myDate, format).atZone(ZoneId.systemDefault());\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,Jacob G.\xe2\x80\x99 尝试两者的想法还不错。这里\xe2\x80\x99是我的版本:

\n\n
public ZonedDateTime getZdt(String myDate, String format) {\n    try {\n        return LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern(format))\n                .atZone(ZoneId.systemDefault());\n    } catch (DateTimeParseException dtpe) {\n        return LocalDate.parse(myDate, DateTimeFormatter.ofPattern(format))\n                .atStartOfDay(ZoneId.systemDefault());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,人们可能更愿意省略format并使用两种常量格式。

\n