使用LocalDate将一个日期更改为另一种日期格式

时间:2019-09-04 15:30:37

标签: java spring-boot date timezone

我将以下输入作为

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"

...现在我该怎么办?

1 个答案:

答案 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