Java LocalDate解析器无法将月份解析为字符串:';8月和27日;

Java LocalDate解析器无法将月份解析为字符串:';8月和27日;,java,datetime,datetime-format,Java,Datetime,Datetime Format,我试图用LocalDate解析以下字符串:“2015年8月4日” 在尝试了DateTimeFormatters的一些变体之后,我在SO中查找答案,发现答案中给出的一些解析示例对我来说并不适用。经过进一步调查,我发现Java14无法解析包含字符串月份的日期,例如“Jul”、“Feb”。。。但在Java8和Java10中,它工作得完美无缺 引发的异常为: java.time.format.DateTimeParseException:无法在索引3处分析文本“2015年8月4日” Java14中的Lo

我试图用LocalDate解析以下字符串:“2015年8月4日”

在尝试了DateTimeFormatters的一些变体之后,我在SO中查找答案,发现答案中给出的一些解析示例对我来说并不适用。经过进一步调查,我发现Java14无法解析包含字符串月份的日期,例如“Jul”、“Feb”。。。但在Java8和Java10中,它工作得完美无缺

引发的异常为:

java.time.format.DateTimeParseException:无法在索引3处分析文本“2015年8月4日”

Java14中的LocalDate/DateTimeFormatter是否有任何更改?我在文档中找不到任何东西

下面是在java 8/10上成功打印并在java 14上引发DateTimeParseException的代码:

  public static void main(String[] args) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy");
    String anotherDate = "04 Aug 2015";
    LocalDate lds = LocalDate.parse(anotherDate, dtf);
    System.out.println(anotherDate + " , " + lds);
  }

将“八月”变为“第八个月”并非易事;大多数语言没有“Aug”

解析器将区域设置作为作业的一部分,并使用它来翻译(缩短的)月份名称

如果不指定它,则会得到系统默认值,这可能会有问题(因为在运行此操作的每个JVM上都可能不同)

我猜您的JDK14安装使用的默认语言环境与其他安装不同

按如下方式进行测试:

System.out.println(java.util.Locale.getDefault());
要修复解析代码,请执行以下操作:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH);
注意:虽然模式(“模式”)的DTF是非常常见的在java代码和一百万堆栈溢出示例中,99%的代码行存在错误——考虑到java通常部署在服务器上和/或此代码用于解析web流量而不是本地类型的内容,使用系统默认语言环境的模式是不正确的


就像您几乎不应该使用的那样,比如说,
newfilewriter(“filename”)
,而应该使用
newfilewriter(“filename”,StandardCharsets.utf8)DateTimeFormatter.ofPattern-如果您的IDE能够列出禁止使用的方法(调用方法时必须附带说明您知道自己在做什么的注释),您应该添加它。

将“八月”变为“第八个月”并非易事;大多数语言没有“Aug”

解析器将区域设置作为作业的一部分,并使用它来翻译(缩短的)月份名称

如果不指定它,则会得到系统默认值,这可能会有问题(因为在运行此操作的每个JVM上都可能不同)

我猜您的JDK14安装使用的默认语言环境与其他安装不同

按如下方式进行测试:

System.out.println(java.util.Locale.getDefault());
要修复解析代码,请执行以下操作:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH);
注意:虽然模式(“模式”)的DTF是非常常见的
在java代码和一百万堆栈溢出示例中,99%的代码行存在错误——考虑到java通常部署在服务器上和/或此代码用于解析web流量而不是本地类型的内容,使用系统默认语言环境的模式是不正确的


就像您几乎不应该使用的那样,比如说,
newfilewriter(“filename”)
,而应该使用
newfilewriter(“filename”,StandardCharsets.utf8)DateTimeFormatter.ofPattern-如果您的IDE能够列出禁止使用的方法(调用这些方法时必须附带说明您知道自己在做什么的注释),您应该添加它。

对我来说很好。默认的
语言环境是什么?你确定这对Java-10也适用吗?对我也适用。它是否为您抛出了错误?感谢您的检查,这似乎是区域设置的问题。当我尝试在Java10上运行它时,它是在另一台可能具有正确语言环境的机器上运行的。在尝试了rzwitserloot的答案之后,它可能说明了显而易见的问题,但是这个问题与Java14(以及
Java-14
)无关。可能你想考虑从你的问题中删除它的引用。或者更新你的问题,用其他方式把它弄清楚?对我来说很好。默认的
语言环境是什么?你确定这对Java-10也适用吗?对我也适用。它是否为您抛出了错误?感谢您的检查,这似乎是区域设置的问题。当我尝试在Java10上运行它时,它是在另一台可能具有正确语言环境的机器上运行的。在尝试了rzwitserloot的答案之后,它可能说明了显而易见的问题,但是这个问题与Java14(以及
Java-14
)无关。可能你想考虑从你的问题中删除它的引用。或者更新你的问题,以其他方式澄清问题?注:大量“为我工作”的评论正是.ofPattern(pattern)等方法如此邪恶的原因。测试没有发现这个错误。答案解释得很好,谢谢。PS我的猜测是99%被夸大了;有一些格式模式字符串不包含任何对区域设置敏感的元素,因此模式(字符串)
的arg
DateTimeFormatter.ofPattern(字符串)
就可以了。@Ole,我相信您可以从内存中快速确定哪些是。如果你搞砸了,惩罚就是你在单元测试中找不到的bug。我完全赞成你每次指定语言环境的方法,如果只是以防万一的话。它通常比在所有可用的语言环境中运行单元测试要简单得多。注意:大量的“为我工作”注释正是.ofPattern(pattern)等方法如此邪恶的原因。测试没有发现这个错误。答案解释得很好,谢谢。PS我的猜测是99%被夸大了;存在不包含任何区域设置敏感元素的格式模式字符串,因此一个arg
DateTimeFormatter.ofPattern(String)