我有以下方式格式化的日期:
四位数年份则在两位数的周数。
举例来说,2018年第四周将是201804。
我无法解析使用Java 8的和LOCALDATE这些DateTimeFormatterBuilder日期。
这里是我尝试分析日期:
LocalDate.parse(
"201804",
new DateTimeFormatterBuilder().appendPattern("YYYYww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);
执行抛出以下异常:
java.time.format.DateTimeParseException:文本“201804”不能在索引0解析
奇怪的行为是,当我添加日期部分之间的隔板,除了不再被抛出:
LocalDate.parse(
"2018 04",
new DateTimeFormatterBuilder().appendPattern("YYYY ww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);
结果是 :
2018-01-22
有我与格式失踪的事情?
您可以使用appendValue
此方法支持的解析称为“相邻值解析”的特殊技术。这种技术解决了其中的值,可变的或固定的宽度,之后是一个或多个固定长度的值的问题。标准解析器是贪心,因此它通常会窃取由后面的可变宽度一个固定宽度值解析器所需要的位数。
不需要采取任何行动以启动“相邻的价值分析”。当被制成appendValue的呼叫时,构建器进入相邻的值解析设置模式。
所以这工作原理:
LocalDate.parse(
"201804",
new DateTimeFormatterBuilder()
.appendValue(YEAR, 4)
.appendValue(ALIGNED_WEEK_OF_YEAR, 2)
.parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);
尝试明确定义计时领域:
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);
是啊,这也害了我很多次与来自国外的数据....
根据你得到什么,你需要不同的解析器。对于一个日期,你需要和LOCALDATE的东西有时间你需要LocalTimedate.parse。
这意味着如果你不知道你会得到什么样的数据(常见的当前日期是没有日期,但随着时间的推移,并在过去另一方面日期没有时间但日期 - 所以你不知道),你必须首先做一个粗略的分析自己,以检测特定格式后,才让Java的解析吧.... Java类日期处理是恕我直言有点困难。
所以,解决办法是:使用替代LOCALDATE的LocalTimeDate。
那不是简单地做这项工作?
LocalDate.parse("2018041", DateTimeFormatter.ofPattern("YYYYwwe"));
基本上你需要告诉它你想要的那一周的Monday
日起,不只是一周。