Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或YYYYMMDD_Java_Date_Java 8_Java Time_Date Parsing - Fatal编程技术网

Java 将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或YYYYMMDD

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,但问

我试图使用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
,但问题是我的
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