Java 将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或YYYYMMDD
我试图使用Java 8重新格式化今天的日期,但出现以下错误: java.time.format.DateTimeParseException:无法分析文本“09-OCT-2017”: 无法从临时Accessor获取LocalDate: {WeekBasedyar[WeekFields[SUNDAY,1]]=2017,MonthOfYear=10,DayOfYear=9},类型为java.time.format.Parsed的ISO 代码: 我以前尝试过使用Java 将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或YYYYMMDD,java,date,java-8,java-time,date-parsing,Java,Date,Java 8,Java Time,Date Parsing,我试图使用Java 8重新格式化今天的日期,但出现以下错误: java.time.format.DateTimeParseException:无法分析文本“09-OCT-2017”: 无法从临时Accessor获取LocalDate: {WeekBasedyar[WeekFields[SUNDAY,1]]=2017,MonthOfYear=10,DayOfYear=9},类型为java.time.format.Parsed的ISO 代码: 我以前尝试过使用SimpleDateFormat,但问
SimpleDateFormat
,但问题是我的inputDateFormat
格式始终是大写的DD-MMM-YYYY
,这给了我不正确的结果,所以我尝试使用ParseCaseSensitive()
忽略区分大小写。我希望你说得对。
将字符串格式化为LocalDate非常简单。您的日期格式是2017年10月9日吗?
现在,您只需使用split命令将其划分为日、月和年:
String[] tempStr = inputDate.split("-");
int year = Integer.parseInt(tempStr[2]);
int month = Integer.parseInt(tempStr[1]);
int day = Integer.parseInt(tempStr[0]);
在这之后,很容易就可以将其保存到LocalDate:
LocalDate ld = LocalDate.of(year, month, day);
我希望这有帮助。您告诉我输入格式是DD-MMM-YYYY
,大写的DD
是一年中的天字段,yyy
是基于周的年字段(可能是)
您需要将它们更改为小写的dd
(月日)和yyyy
(纪年)。parseCaseSensitive()
只处理文本字段-在本例中,是月份名称(数字不受大小写敏感度的影响-仅仅因为月份是大写的,并不意味着数字模式也应该是大写的)
代码的其余部分是正确的。示例(将格式更改为yyyyMMdd
):
上述代码的输出为:
20171009
关于无法控制输入模式,一种替代方法是手动将字母替换为小写版本:
String pattern = "DD-MMM-YYYY";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
// replace DD and YYYY with the lowercase versions
.appendPattern(pattern.replace("DD", "dd").replaceAll("YYYY", "yyyy"))
.toFormatter(Locale.ENGLISH);
// do the same for output format if needed
我不认为它需要一个复杂的正则表达式来替换所有的东西。只需多次调用
replace
方法就可以做到这一点(除非你有真正的复杂模式,需要大量不同而复杂的调用replace
,但只要你提供的案例就足够了)。好吧,MonthOfYear=10
和DayOfYear=9
不合适,因为每年的第九天肯定不是十月。这是因为使用DD
的输入格式显然是错误的。还要注意的是parseCaseSensitive()
旨在忽略正在解析的日期的大小写,而不是正在传递的模式,也就是说,将2017年10月9日
和2017年10月9日
等同等对待。inputDateFormat的格式是DD-MMM-YYYY
,那么我的模式错了吗?@thomas,感谢您对parseCaseSensitive()
的澄清。我的模式总是大写的,这导致了我的问题。谢谢,我的输入日期可能有几种不同的格式,所以上面的格式并不总是有效。老实说,让用户决定日期应该是什么样子从来都不是一个好主意。您是否使用某种GUI日历?谢谢,代码不起作用的原因是模式DD-MMM-YYYY始终以大写形式存储在变量inputDateFormat
中。我无法控制这一点,所以我需要的是一个正则表达式模式来将上述格式转换为dd-MMM-yyyy@Orby我已经更新了答案(实际上不需要正则表达式,一个简单的替换就可以解决它)。但是,请下次不要忘记在问题中包含所有这些细节(您也可以随时编辑它以包含更多信息)。没有所有的细节和要求,人们无法正确回答。谢谢,这就是我试图用正则表达式实现的!同意,这是一个简单的用例!再次感谢你的帮助:)@Hugo当然,干得好。我的评论仅供他人参考。
String inputDate = "09-OCT-2017";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
// use "dd" for day of month and "yyyy" for year
.appendPattern("dd-MMM-yyyy")
.toFormatter(Locale.ENGLISH);
LocalDate localDate = LocalDate.parse(inputDate, inputFormatter);
// use "dd" for day of month and "yyyy" for year
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String formattedString = localDate.format(outputFormatter);
System.out.println(formattedString); // 20171009
String pattern = "DD-MMM-YYYY";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
// replace DD and YYYY with the lowercase versions
.appendPattern(pattern.replace("DD", "dd").replaceAll("YYYY", "yyyy"))
.toFormatter(Locale.ENGLISH);
// do the same for output format if needed