我将以下输入作为
Map<String,String>
1) MM dd yyyy = 08 10 2019
2) dd MM yyyy = 10 05 2019
3) dd MM yyyy = 05 10 2008
4) yyyy dd MM = 2001 24 01
我想将所有这些日期转换为“ yyyy-MM-dd”格式
当前,我正在使用
for (String eachFormat : formats) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(eachFormat);
try {
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd");
Date inputDate = simpleDateFormat.parse(parsedDate.get(eachFormat));
return targetFormat.format(inputDate);
} catch (ParseException e) {
LOGGER.error(e);
}
}
,但“ simpleDateFormat.parse()”将使用时区进行转换并给我日期。转换时我不希望时区。我想直接将一种日期格式转换为其他日期格式。我正在探索LocalDate作为Java 8功能。但是如果我尝试的话就会失败
DateTimeFormatter target = DateTimeFormatter.ofPattern(eachFormat);
LocalDate localDate = LocalDate.parse(parsedDate.get(eachFormat),target);
请帮助我使用LocalDate和DateTimeFormatter。
编辑1:好吧,我对键入Map示例不利,这是我实际的Map 进入程序
1) MM dd yy = 8 12 2019
2) dd MM yy = 4 5 2007
3) yy dd MM = 2001 10 8
我猜正在识别并给我这张地图的人正在使用SimpleDate格式化程序,因为我认为SimpleDateFormatter可以将日期“ 8 12 2019”标识为“ MM dd yy”或“ M dd yyyy”或“ MM d yy”或“ MM d yyyy”。...
但是“ LocalDate”非常严格,它不是解析日期
"8 12 2019" for "dd MM yy"
仅当日期格式时才严格解析
"8 12 2019" is "d MM yyyy"
...现在我该怎么办?
答案 0 :(得分:1)
是的,很旧而且麻烦的SimpleDateFormat
在解析时通常不会过多注意格式模式字符串中模式字母的数量。 DateTimeFormatter
这样做,这通常是一个优势,因为它可以更好地验证字符串。 MM
要求两个数字表示月份。 yy
需要两位数的年份(例如19代表2019)。由于您需要能够解析一位数字的月份,月份的某天和一年的四位数的年份,因此我建议我们修改格式模式字符串以准确地告诉DateTimeFormatter
。我正在将MM
更改为M
,将dd
更改为d
,将yy
更改为y
。这将使DateTimeFormatter
不必担心位数(一个字母基本上表示至少个位数)。
Map<String, String> formattedDates = Map.of(
"MM dd yy", "8 12 2019",
"dd MM yy", "4 5 2007",
"yy dd MM", "2001 10 8");
for (Map.Entry<String, String> e : formattedDates.entrySet()) {
String formatPattern = e.getKey();
// Allow any number of digits for each of year, month and day of month
formatPattern = formatPattern.replaceFirst("y+", "y")
.replace("dd", "d")
.replace("MM", "M");
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern(formatPattern);
LocalDate date = LocalDate.parse(e.getValue(), sourceFormatter);
System.out.format("%-11s was parsed into %s%n", e.getValue(), date);
}
此代码段的输出为:
8 12 2019 was parsed into 2019-08-12 4 5 2007 was parsed into 2007-05-04 2001 10 8 was parsed into 2001-08-10