为了账号安全,请及时绑定邮箱和手机立即绑定

本地日期解析在没有分隔符的情况下不起作用

本地日期解析在没有分隔符的情况下不起作用

慕仙森 2022-06-04 16:17:17
我的日期格式如下:四位数的年份,然后是两位数的周数。例如,2018 年的第四周将是201804。我无法使用 Java 8 的LocalDate和DateTimeFormatterBuilder解析这些日期。这是我尝试解析日期的方法:LocalDate.parse(    "201804",    new DateTimeFormatterBuilder().appendPattern("YYYYww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter());执行引发以下异常:java.time.format.DateTimeParseException:无法在索引 0 处解析文本“201804”奇怪的行为是,当我在日期部分之间添加分隔符时,不再抛出异常:LocalDate.parse(    "2018 04",    new DateTimeFormatterBuilder().appendPattern("YYYY ww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter());结果是 :2018-01-22格式化程序有什么我缺少的吗?
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您可以使用appendValue

此方法支持一种特殊的解析技术,称为“相邻值解析”。该技术解决了一个值(可变宽度或固定宽度)后跟一个或多个固定长度值的问题。标准解析器是贪婪的,因此它通常会窃取可变宽度值 1 之后的固定宽度值解析器所需的数字。

启动“相邻值解析”不需要任何操作。当调用 appendValue 时,构建器进入相邻值解析设置模式。

所以这有效:

LocalDate.parse(
                "201804",
                new DateTimeFormatterBuilder()
                        .appendValue(YEAR, 4)
                        .appendValue(ALIGNED_WEEK_OF_YEAR, 2)
                        .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
        );


查看完整回答
反对 回复 2022-06-04
?
隔江千里

TA贡献1906条经验 获得超10个赞

尝试明确定义计时字段:


DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();

DateTimeFormatter formatter = 

      builder.appendValue(ChronoField.YEAR, 4)

             .appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR, 2)

             .parseDefaulting(ChronoField.DAY_OF_WEEK, 1)

             .toFormatter();


LocalDate.parse("201804", formatter);


查看完整回答
反对 回复 2022-06-04
?
心有法竹

TA贡献1866条经验 获得超5个赞

是的,这也让我用国外来源的数据杀死了我很多次......

根据你得到的,你需要不同的解析器。对于日期,您需要 LocalDate,对于有时间的东西,您需要 LocalTimedate.parse。

意思是如果你不知道你得到什么数据(通常是当天没有日期但有时间,另一方面是过去的日期没有时间但有日期 - 所以你不知道),你必须先做一个粗略的解析自己以检测特定的格式,然后才让 Java 解析它.... Java 的日期处理有点困难。

所以解决方案是:使用 LocalDate 而不是 LocalTimeDate。


查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号