这是我想要做的:
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:)
我想要做的很简单。我如何让这个工作?
最佳答案
我有三个建议给你。
首先,这是否必须是相同的方法?你能要两个吗?我假设您只有两种可能的格式;如果你有十个,我认为这是一个不同的故事。
/** gets a ZonedDateTime from a date string with no time information */
public ZonedDateTime getZdtFromDateString(String myDate, String format) {
return LocalDate.parse(myDate, DateTimeFormatter.ofPattern(format))
.atStartOfDay(ZoneId.systemDefault());
}
您当然可以省略
format
参数,并将格式设置为常量。当然,您可以通过一种方法获得您想要的东西。我建议您的方法不是将格式传递给方法,而是自行检测它。
一种选择是处理两种格式的自定义
DateTimeFormatter
:private static final DateTimeFormatter format = new DateTimeFormatterBuilder().appendPattern("dd-MM-uuuu")
.optionalStart()
.appendPattern(" HH:mm:ss")
.optionalEnd()
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.toFormatter();
public ZonedDateTime getZdt(String myDate) {
return LocalDateTime.parse(myDate, format).atZone(ZoneId.systemDefault());
}
最后,Jacob G.’s idea of trying both 还不错。这是我的版本:
public ZonedDateTime getZdt(String myDate, String format) {
try {
return LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern(format))
.atZone(ZoneId.systemDefault());
} catch (DateTimeParseException dtpe) {
return LocalDate.parse(myDate, DateTimeFormatter.ofPattern(format))
.atStartOfDay(ZoneId.systemDefault());
}
}
同样,人们可能更喜欢省略
format
参数并使用两种常量格式。关于java - 如果 HH :mm:ss is not defined?,我如何创建默认的 ZonedDateTime 到午夜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44037216/