我的问题如下。我正在阅读一个文件,它包含一堆CSV行。每行包含格式为22-mar-2010
或类似格式的某日期,即格式为dd-MMM-yyyy
。我想将其转换为ISO格式,因此它变成2010-03-22
。Java英文日期格式解析
我的代码看起来是这样的:
private String convertDate(String date) {
DateTimeFormatter oldFormat = DateTimeFormatter.ofPattern("dd-MMM-yyyy", new Locale("en"));
LocalDate parsedDate = LocalDate.parse(date, oldFormat);
DateTimeFormatter newFormat = DateTimeFormatter.ISO_DATE;
String newDate = parsedDate.format(newFormat);
return newDate;
}
输入看起来是这样的:
sdfdsfslk 28-mar-2007 dfdsljs
sdfdsfslk 20-apr-2014 dfdsljs
sdfdsfslk 13-oct-2005 dfdsljs
sdfdsfslk 20-may-2014 dfdsljs
sdfdsfslk 20-jan-2014 dfdsljs
sdfdsfslk 20-feb-2014 dfdsljs
如果包括区域如上或使用withLocale(Locale.ENGLISH)
则未能在第一行日期串。唯一的例外是:
java.time.format.DateTimeParseException: Text '28-mar-2007' could not be parsed at index 3
如果我删除区域部分,只是有:
DateTimeFormatter.ofPattern("dd-MMM-yyyy");
然后它,直到它遇到这样一个日期13-oct-2005
。它不喜欢英文'oct',并且在LocalDate.parse
行失败。如果我将oct转换为okt(瑞典语,我在哪里),那么它会解析它。
我需要完全更改我的语言环境吗?或者在这里出了什么问题?即使我在瑞典,我怎样才能用英文解析日期呢?
总是涉及'Locale'。如果您没有明确指定'Locale',那么隐式应用您的JVM的当前默认语言环境。因此'okt'已成功解析,因为您的JVM的当前默认瑞典语区域设置是以您的名义应用的。 –
是的,但问题是我提供了一个语言环境,但没有批准小写月份。因此,转换为大写到3月 –
不,实际上问题是使用的传入日期(a)本月名称的英文不当,&(b)日期值的格式选择不当。作为解决方法,请参阅[我的答案](http://stackoverflow.com/a/39213129/642706),以制作不区分大小写的解析器来适应不正确的英语。并教育程序员关于[ISO 8601]的源数据(https://en.wikipedia.org/wiki/ISO_8601)。我上面的评论是为了解释为什么你删除'Locale'然后用瑞典语文本成功。隐含的瑞典语“Locale”期望小写月份名称,而英语期望初始上限。 –