当前位置: 首页 > 面试题库 >

当所有字段(包括分隔符,但不包括年份)为可选时,在Java8中解析ISO 8601日期

夔博
2023-03-14
问题内容

我需要以各种精度级别解析Java中ISO8601格式的字符串。我需要解析的字符串的一些示例是:

  • 2018年
  • 2018-10
  • 2018-10-15
  • 2018-10-15T12:00
  • 2018-10-15T12:00:30
  • 2018-10-15T12:00:30.123
  • 20181015
  • 201810151200
  • 20181015120030
  • 20181015120030.123
  • 20181015T12:00:30.123

在没有字段的情况下,我可以自由假定适用的最低有效值(例如,如果缺少月份,则可以假定一月,如果缺少日期,则可以假定为月的第一天,如果时间是缺少假定午夜)

我已经搜索了SO,发现的所有示例都假定我事先知道确切的格式。


问题答案:

好吧,这花了我比预期更长的时间。唯一有效的解析器是:

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4)
        .appendPattern("[['-']MM[['-']dd[['T']HH[[':']mm[[':']ss['.'SSS]]]]]]")
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
        .toFormatter();

String[] s = {
        "2018",
        "2018-10",
        "2018-10-15",
        "2018-10-15T12:00",
        "2018-10-15T12:00:30",
        "2018-10-15T12:00:30.123",
        "20181015",
        "201810151200",
        "20181015120030",
        "20181015120030.123",
        "20181015T12:00:30.123"
};
for (String line : s) {
  System.out.println(LocalDateTime.parse(line, dtf));
}

问题是yyyy创建一个ValueParser(minWidth=4, maxWidth=19, SignStyle.PAD_EXEEDS)解析日期的a
20181015作为year=20181015示例。因此我们必须将数字宽度限制year为4。

该文档指出:

:字母的数目确定最小字段宽度,在该最小字段宽度以下使用填充。

但未指定最大宽度。



 类似资料:
  • 当我使用之类的东西时,它仍然会触发,就像连字符无效一样。我尝试了和

  • 我有一个来自服务器的响应。需要使用分隔符“=”分割响应,但对于其中一个参数,其值中也需要包含“=”。示例:响应:Name=Hi 一旦我得到这个响应,我就用 我尝试了不同的包含先行分隔符正则表达式的方法,但都不起作用。

  • 期望的行为 我有一个输入验证,除其他外,测试长度(

  • 问题内容: 我想匹配所有URL,但从与该正则表达式匹配的beeing中排除图像URL:jpe?g | gif | png。 \ b(?:https?| ftp | file):// [-A-Z0-9 +&@#/%?=〜 | $!:,。;] * A-Z0-9 +&@# /%=〜 | $ 问题是带有排除项的部分不能像这样工作:(?!jpe?g | gif | png) 有人对此有解决方案吗? 例: 不

  • 问题内容: 我正在尝试编写一个MySQL查询,以获取给定日期之间所有月份的每月平均值。我的想法是这样的: 查询,类似 您看到,在2009年4月没有输入任何值,但是我希望它在输出中显示为0、0值。关于如何实现这一目标的任何想法?可以在MySQL中完成吗? 问题答案: 我同意Lieven的回答,请创建一个表,其中包含您可能需要的所有月份,并使用该表将“ LEFT JOIN”到结果表。请记住,这是一个很

  • 我在这里有我的日期来自我的API,我试图在其中解析到。我使用intl包尝试了以下方法,但我遇到了错误 未处理的异常:格式异常:尝试从 2020/07/07 09:47:54 在位置 20 读取 有人知道这里出了什么问题吗?