我的日期格式如下:
年是四位数,周是两位数。
例如,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
格式化程序有什么我遗漏的吗?
4条答案
按热度按时间ve7v8dk21#
尝试显式定义计时字段:
iklwldmw2#
是的,这也让我在国外的数据中丧生了很多次。。。。
根据您得到的内容,您需要不同的解析器。对于一个日期,您需要localdate;对于一个时间,您需要localtimedate.parse。
意思是如果你不知道你得到了什么样的数据(通常今天没有日期但有时间,另一方面过去没有时间但有日期的日期-所以你不知道),你必须首先自己做一个粗略的解析,以便检测特定的格式,只有在java允许解析它之后。。。。javas的数据处理有点困难。
所以解决方案是:使用localdate而不是localtimedate。
gkl3eglg3#
不只是做这个工作吗?
LocalDate.parse("2018041", DateTimeFormatter.ofPattern("YYYYwwe"));
基本上你需要告诉它你想要的日期Monday
那一周,不仅仅是这一周。w8rqjzmb4#
你可以用
appendValue
此方法支持一种称为“相邻值解析”的特殊解析技术。此技术解决了一个值(可变或固定宽度)后跟一个或多个固定长度值的问题。标准解析器是贪婪的,因此它通常会窃取固定宽度值解析器所需的数字,而固定宽度值解析器遵循可变宽度值。无需任何操作即可启动“相邻值分析”。调用appendvalue时,生成器进入相邻值解析设置模式。
所以这是可行的: