为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2023-07-13 14:33:55
我有以下输入作为Map<String,String>1) MM dd yyyy = 08 10 20192) dd MM yyyy = 10 05 20193) dd MM yyyy = 05 10 20084) 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 20192) dd MM yy = 4 5 20073) 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 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

是的,老的,SimpleDateFormat解析的时候麻烦,一般都不太关注格式模式字符串中模式字母的个数。DateTimeFormatter确实如此,这通常是一个优点,因为它可以更好地验证字符串。MM月份需要两位数。yy需要两位数的年份(例如 2019 年为 19)。由于您需要能够解析一位数字的月份、月份中的某一天以及四位数字的年份,因此我建议我们修改格式模式字符串以准确地说明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


查看完整回答
反对 回复 2023-07-13
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信