转换日期格式:Java中的转换错误?

3

我正在尝试将此日期转换为不同的格式。不幸的是,我无法成功解析日期并正确保留所有信息。

06-Dec-2017 07:14:56.656PM 转换为 2017-12-06 19:14:56.656

如果我尝试解析输入日期

LocalDateTime.parse("06-Dec-2017 07:14:56.656PM",
        DateTimeFormatter.ofPattern("D-MMM-yyyy HH:mm:ss.SSSa"));

我遇到了以下错误 - 不确定它的含义是什么?
Exception in thread "main" java.time.format.DateTimeParseException: Text '06-Dec-2017 07:14:56.656PM' could not be parsed: Conflict found: Field MonthOfYear 1 differs from MonthOfYear 12 derived from 2017-01-06
    at java.time.format.DateTimeFormatter.createError(Unknown Source)
    at java.time.format.DateTimeFormatter.parse(Unknown Source)
    at java.time.LocalDateTime.parse(Unknown Source)
    at com.cordys.coe.alf.logger.DBLogger.main(DBLogger.java:366)
Caused by: java.time.DateTimeException: Conflict found: Field MonthOfYear 1 differs from MonthOfYear 12 derived from 2017-01-06
    at java.time.format.Parsed.crossCheck(Unknown Source)
    at java.time.format.Parsed.crossCheck(Unknown Source)

如果尝试

System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
        .format((new SimpleDateFormat("DD-MMM-yyyy HH:mm:ss.SSSa")
                .parse("06-Dec-2017 07:14:56.656PM"))));

它提供了以下内容,这可能会令人困惑,并且可能不正确。 2017-01-06 07:14:56:656


3
我建议将 D 改为 d。根据JavaDocs的解释,D 表示一年中的天数,格式为数字,而且具体值为 189。因此,我认为你想使用的是小写字母 d - MadProgrammer
MadProgrammer是正确的,将D替换为d,在此检查所有转换符号:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html - whatamidoingwithmylife
那个消息有点棘手。我相信它的意思是:从一年中的第6天(格式模式字符串中的大写“D”)开始,它会得到1月(第1个月),这与12月(第12个月)冲突。 - Ole V.V.
1
稍微离题,您的经验很好地说明了旧API和新API之间的一个重要区别:如果给定了不正确的格式模式字符串进行解析,现代API会抱怨,因此您知道出了问题,而SimpleDateFormat通常只会给您错误的结果并假装一切正常,我认为这更加危险。 - Ole V.V.
1个回答

11

你有两个问题

  1. D 应更改为 d

D 表示年份的第几天

d 表示当月的第几天

  1. HH 应更改为 hh

H 表示一天中的小时数 (0-23)

h 表示上午/下午的小时数 (1-12)

请将 D-MMM-yyyy HH:mm:ss.SSSa 更改为 d-MMM-yyyy hh:mm:ss.SSSa

欲知详情,请查看oracle文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接