当所有字段(包括分隔符,但不包括年份)都是可选字段时,在Java8中解析ISO 8601日期
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了当所有字段(包括分隔符,但不包括年份)都是可选字段时,在Java8中解析ISO 8601日期,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1524字,纯文字阅读大概需要3分钟。
内容图文
![当所有字段(包括分隔符,但不包括年份)都是可选字段时,在Java8中解析ISO 8601日期](/upload/InfoBanner/zyjiaocheng/697/cf95bb378cbb4337bdbc70aa0ef6704e.jpg)
我需要在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
如果我没有字段,那么我可以自由地假设适用的最低有效值(例如,如果缺少月份,我可以假设1月,如果缺少那一天则假定当月的第一天以及时间失踪假设是午夜)
我搜索了所有我发现的所有例子都假设我事先知道确切的格式.
解决方法:
那比我想象的要长.唯一有效的解析器是:
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),它将日期20181015解析为year = 20181015作为示例.所以我们必须将年份的数字宽度限制为4.
文件说明:
Year: The count of letters determines the minimum field width below which padding is used.
但是没有指定最大宽度.
内容总结
以上是互联网集市为您收集整理的当所有字段(包括分隔符,但不包括年份)都是可选字段时,在Java8中解析ISO 8601日期全部内容,希望文章能够帮你解决当所有字段(包括分隔符,但不包括年份)都是可选字段时,在Java8中解析ISO 8601日期所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。