java - 如果 HH :mm:ss is not defined?,我如何创建默认的 ZonedDateTime 到午夜

标签 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:) 

我想做的很简单。我如何让它工作?

最佳答案

我有三个建议给你。

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

/** 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/

相关文章:

java - 我该如何解决这个问题?

javascript - Java 8 lambda(来自 javascript 示例)

java - 如何解决 "weblogic.application.ModuleException: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer"错误

java - install4j自动更新下载失败

java - 我正在使用 Apache POI 将 PPTX 幻灯片转换为图像,但生成的图像的大小非常巨大,超过 1.5 mb

java - 如何使用 Java 8 lambda 将对象添加到另一个列表内的列表中

sql-server - 获取 DATETIME 给出的一周内的某个工作日

sql-server - 我可以获得包含不可转换为日期时间的 varchar 值的行列表吗?

django - 导出日期显示为 UTC

Java 8 多重映射