没有分隔符时本地日期解析不起作用

vawmfj5a  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(344)

我的日期格式如下:
年是四位数,周是两位数。
例如,2018年的第四周将是201804年。
我在使用Java8的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
格式化程序有什么我遗漏的吗?

ve7v8dk2

ve7v8dk21#

尝试显式定义计时字段:

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);
iklwldmw

iklwldmw2#

是的,这也让我在国外的数据中丧生了很多次。。。。
根据您得到的内容,您需要不同的解析器。对于一个日期,您需要localdate;对于一个时间,您需要localtimedate.parse。
意思是如果你不知道你得到了什么样的数据(通常今天没有日期但有时间,另一方面过去没有时间但有日期的日期-所以你不知道),你必须首先自己做一个粗略的解析,以便检测特定的格式,只有在java允许解析它之后。。。。javas的数据处理有点困难。
所以解决方案是:使用localdate而不是localtimedate。

gkl3eglg

gkl3eglg3#

不只是做这个工作吗? LocalDate.parse("2018041", DateTimeFormatter.ofPattern("YYYYwwe")); 基本上你需要告诉它你想要的日期 Monday 那一周,不仅仅是这一周。

w8rqjzmb

w8rqjzmb4#

你可以用 appendValue 此方法支持一种称为“相邻值解析”的特殊解析技术。此技术解决了一个值(可变或固定宽度)后跟一个或多个固定长度值的问题。标准解析器是贪婪的,因此它通常会窃取固定宽度值解析器所需的数字,而固定宽度值解析器遵循可变宽度值。
无需任何操作即可启动“相邻值分析”。调用appendvalue时,生成器进入相邻值解析设置模式。
所以这是可行的:

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

相关问题