Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DateTimeFormatter可以解析,但不能格式化相同的输入_Java_Datetime Format_Java Time_Datetime Parsing - Fatal编程技术网

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

Java DateTimeFormatter可以解析,但不能格式化相同的输入,java,datetime-format,java-time,datetime-parsing,Java,Datetime Format,Java Time,Datetime Parsing,模式“yyyy\uw'w”的DateTimeFormatter无法格式化它已解析的值 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.TemporalAcces

模式“yyyy\uw'w”的
DateTimeFormatter
无法格式化它已解析的值

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)
错误是:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
  java.time.format.Parsed.getLong(Parsed.java:203)
  java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
  java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540)
  java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
  java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
  java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)

为什么会这样?

对我来说,你不能用DateTimeFormatter来格式化一个临时的Accessor,因为它是一个太宽泛的时间接口。首先尝试将其强制转换为DateTime对象。

模式
yyyy
表示。但是,也有模式
uuu
来表示(阅读这些链接可以看到它们之间的细微差别——尽管对于当前日期没有太大差别)

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

值(YearOfEra,4,19,超过\u PAD)

但是在解析时,生成的解析对象(在您的例子中,是
week
变量)是使用year字段创建的-您可以通过值看到:

{=2017年


格式化程序设置了年代字段。因此,当您尝试格式化
时,它会尝试从
变量获取此字段。因为此字段不存在(
只包含年代,而不包含年代),它抛出
不受支持的临时类型异常

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

val df = DateTimeFormatter.ofPattern("uuuu_'w'w")
println(df)
val week = df.parse("2017_w19")
println(week)
println(df.format(week))
输出将是:

值(年份,4,19,超过了“PAD”的“w”本地化值(WeekOfWeekBasedYear,1)
{=2017年,周-周-周-周-基-代尔[周-场[周日,1]]=19},ISO
2017年11月19日


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

这是什么语言?Scala?(这对您的问题并不重要,只是Java工程师很难阅读。)如果你没有得到一个有用的答案,你可以把它翻译成Java,以达到更广泛的受众。