LocalDateTime(或任何其他合适的类)和 time 作为可选参数

LocalDateTime (or any other suitable class) with time as optional paramter

提问人:Abhinash Jha 提问时间:2/3/2023 最后编辑:MC EmperorAbhinash Jha 更新时间:4/5/2023 访问量:131

问:

我正在尝试解析可能包含时间或不包含时间的传入字符串。以下两个日期都应被接受

"2022-03-03" and "2022-03-03 15:10:05".

我知道的 DateTimeFormatter 在任何一种情况下都会失败。这是我得到的一个答案,但我不知道时间部分是否可以在这里成为可选的。

ISO_DATE_TIME.format() 转换为具有可选偏移量的 LocalDateTime

这个想法是,如果时间部分不存在,我应该将其设置为一天的结束,所以时间部分应该是 23:59:59。

任何帮助都是值得赞赏的。谢谢!

java 时间 localdate datetimeformatter

评论

0赞 MadProgrammer 2/3/2023
尝试将其解析为 ,如果失败,请尝试将其解析为,并将“time”组件附加到该组件以获得 .你“可以”使用正则表达式,但你只是在时间应该的地方测试数字的存在,而不是验证这些值是否确实正确LocalDateTimeLocalDateLocalDateTime
0赞 Abhinash Jha 2/3/2023
我可以试着这样做。但这可能会提出一个问题,如果解析 LocalDate 失败怎么办,因为“数据”可能会损坏,就像只有年份部分是“2025”一样。
1赞 MadProgrammer 2/3/2023
然后你需要处理这些可能性 - 如果既不解析输入,也不解析输入,那么假设输入不正确 - 同样,如果它“真的”重要,你可以使用正则表达式,但同样,即使它通过,也不能保证数据代表有效的日期/时间LocalDateLocalDateTime

答:

3赞 MC Emperor 2/3/2023 #1

好吧,您可以使用 a 来指定缺失字段的默认值:DateTimeFormatterBuilder

private static LocalDateTime parse(String str) {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM-dd[ HH:mm:ss]")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 23)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 59)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 59)
        .toFormatter();
    return LocalDateTime.parse(str, formatter);
}

该模式指定它将尝试解析的模式。请注意,方括号 () 是可选部分。它们之间的一切都将被完全消耗,或者完全丢弃。[]

使用 您可以指定缺少字段时的默认值。在您的例子中,如果用户只提供日期,则缺少一天中的小时、每小时的分钟和分钟的秒字段,这就是需要为它们提供默认值的原因。parseDefaulting


System.out.println(parse("2022-03-03"));
System.out.println(parse("2022-03-03 15:10:05"));
System.out.println(parse("2025"));

输出以下内容:

2022-03-03T23:59:59
2022-03-03T15:10:05
Exception in thread "main" java.time.format.DateTimeParseException: Text '2025' could not be parsed at index 4

评论

1赞 John Williams 2/3/2023
今天学到了一些东西,谢谢。