DateTimeFormatter可以解析,但不能格式化相同的输入

时间:2017-08-17 07:24:02

标签: java datetime-format java-time datetime-parsing

模式DateTimeFormatter的{​​{1}}无法格式化已解析的值。

"yyyy_'w'w"

错误是:

val df = DateTimeFormatter.ofPattern("yyyy_'w'w")
df: DateTimeFormatter = Value(YearOfEra,4,19,EXCEEDS_PAD)'_''w'Localized(WeekOfWeekBasedYear,1)

val week = df.parse("2017_w19")
week: temporal.TemporalAccessor = {Year=2017, WeekOfWeekBasedYear[WeekFields[SUNDAY,1]]=19},ISO

df.format(week)

为什么会这样?

2 个答案:

答案 0 :(得分:1)

模式yyyy代表year-of-era field。但是according to javadoc,还有uuuu模式来表示year field(阅读这些链接以查看它们之间的微小差异 - 尽管当前日期没有太大区别)。

问题是:当您使用y创建格式化程序时,它会使用年代字段,您可以通过以下值看到:

  

值(的 YearOfEra 下,4,19,EXCEEDS_PAD)

但是在解析时,生成的解析对象(在您的情况下,week变量)是使用字段创建的 - 正如您可以通过值看到的那样:

  

{ = 2017年,......

格式化程序设置为年度字段。因此,当您尝试格式化week时,它会尝试从week变量中获取此字段。由于此字段不存在(week仅包含,但不包含年代),因此会抛出UnsupportedTemporalTypeException。< / p>

解决方案是在格式化程序中使用字段(u模式):

val df = DateTimeFormatter.ofPattern("uuuu_'w'w")
println(df)
val week = df.parse("2017_w19")
println(week)
println(df.format(week))

输出将是:

  

值(的下,4,19,EXCEEDS_PAD) '_''w'Localized(WeekOfWeekBasedYear,1)
  { = 2017年,WeekOfWeekBasedYear [WeekFields [SUNDAY,1]] = 19},ISO
  2017_w19

请注意,现在格式化程序是使用字段创建的,format方法现在尝试从已解析的对象中获取此字段,并且不会抛出任何异常。

答案 1 :(得分:0)

对我来说,你不能使用DateTimeFormatter格式化TemporalAccessor,这是一个时间过于宽泛的界面。首先尝试将其强制转换为DateTime对象。