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

我有以下输入作为


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:好的,我对输入地图示例不好,这是我在程序中得到的实际地图


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"

……现在我该怎么办?


慕容森
浏览 169回答 1
1回答

噜噜哒

是的,老的,SimpleDateFormat解析的时候麻烦,一般都不太关注格式模式字符串中模式字母的个数。DateTimeFormatter确实如此,这通常是一个优点,因为它可以更好地验证字符串。MM月份需要两位数。yy需要两位数的年份(例如 2019 年为 19)。由于您需要能够解析一位数字的月份、月份中的某一天以及四位数字的年份,因此我建议我们修改格式模式字符串以准确地说明DateTimeFormatter这一点。我正在改变MM到M,dd到d,yy到y。这将导致DateTimeFormatter不必担心位数(一个字母基本上意味着至少一位数字)。&nbsp; &nbsp; Map<String, String> formattedDates = Map.of(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "MM dd yy", "8 12 2019",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "dd MM yy", "4 5 2007",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "yy dd MM", "2001 10 8");&nbsp; &nbsp; for (Map.Entry<String, String> e : formattedDates.entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; String formatPattern = e.getKey();&nbsp; &nbsp; &nbsp; &nbsp; // Allow any number of digits for each of year, month and day of month&nbsp; &nbsp; &nbsp; &nbsp; formatPattern = formatPattern.replaceFirst("y+", "y")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace("dd", "d")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace("MM", "M");&nbsp; &nbsp; &nbsp; &nbsp; DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern(formatPattern);&nbsp; &nbsp; &nbsp; &nbsp; LocalDate date = LocalDate.parse(e.getValue(), sourceFormatter);&nbsp; &nbsp; &nbsp; &nbsp; System.out.format("%-11s was parsed into %s%n", e.getValue(), date);&nbsp; &nbsp; }该片段的输出是:8 12 2019&nbsp; &nbsp;was parsed into 2019-08-124 5 2007&nbsp; &nbsp; was parsed into 2007-05-042001 10 8&nbsp; &nbsp;was parsed into 2001-08-10
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java