4

我有以下格式的日期:1/1/2020 3:4:7 AM我正在尝试使用DateTimeFormatter.

我有以下代码和格式化程序来解析它,但它不起作用。

LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM", DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));

我得到以下异常:

java.time.format.DateTimeParseException: Text '1/1/2020 3:4:7 AM' could not be parsed at index 0

谁能帮我?

4

4 回答 4

8

两个单独的问题:

错误的计数

您正在使用例如MM,这是一个明确的:始终是全部数字,零填充。你的字符串不是那样的,它只是数字。所以,做那个M/d/uuuu h:m:s a

编辑:更改yyyyuuuu,谢谢@deHaar。推理: yyyy 或 uuuu 很少重要,但请注意,这意味着需要4 位数字。差异在 0 之前持续多年:uuuu变为负数,yyyy不会并希望您使用 egGG以便您得到44 BC而不是-44. 这样,uuuu就更正确了,即使通常不会出现差异。

缺少语言环境

第二个问题是你几乎应该使用这个版本ofPattern- 它有一个错误,你无法通过单元测试来捕捉它,这使得它成为一个“重”数千倍的错误,因此,一个真正的问题.

您需要指定语言环境。没有它,除非您的平台默认语言环境是英语,否则“AM”将不会解析。

把它放在一起

LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM",
  DateTimeFormatter.ofPattern("M/d/uuuu h:m:s a", Locale.ENGLISH));

效果很好。

于 2020-10-05T14:07:01.413 回答
4
  1. 对日期和时间组件(月、日、年、小时、分钟和秒)使用单个字母。

  2. 您还可以使格式化程序以不区分大小写的方式(例如 am、AM、Am)处理模式,如下所示:

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeFormatterBuilder;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
             // Formatter to handle the pattern in case insensitive way (e.g. am, AM, Am)
            DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                                .parseCaseInsensitive()
                                                .appendPattern("M/d/u h:m:s a")
                                                .toFormatter(Locale.ENGLISH);
            LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM", formatter);
            System.out.println(date);
        }
    }
    

输出:

2020-01-01T03:04:07
于 2020-10-05T14:05:42.590 回答
4

在您的代码段中:

LocalDateTime
    .parse("1/1/2020 3:4:7 AM", DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));
  • 1- 不匹配MM
  • 1- 不匹配dd
  • 3 - 不匹配hh
  • 4 - 不匹配mm
  • 7 - 不匹配ss

格式化程序模式部分(例如)的长度和它们在字符串文本MM中的相应部分(例如)不匹配。1

您可以通过几种方式匹配它们,例如,您可以更改字符串文本以匹配格式化程序模式或其他方式。

你可以试试这个:

LocalDateTime
    .parse("01/01/2020 03:04:07 AM", DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));

此外,请查看Pattern Letters and Symbols

于 2020-10-05T14:09:51.083 回答
2

根据DateTimeFormatter 的文档

数字:如果字母计数为1,则使用最小位数输出值且不进行填充。否则,位数将用作输出字段的宽度,必要时将值补零。

通过颠倒推理,您可以尝试使用此格式化程序:

DateTimeFormatter.ofPattern("M/d/yyyy h:m:s a")
于 2020-10-05T14:08:56.347 回答