如何将“ 2016年11月20日12:00:00 AM”解析为LocalDateTime?

问题描述

我发现了一个非常有趣的错误或类似的东西。

我使用这种日期格式MMM d,yyyy hh:mm:ss a,它会像这样打印日期

Aug 13,2020 01:19:50 pm

但是,当我将Nov 20,2016 12:00:00 AM解析为LocalDateTime时,它会抛出异常

java.time.format.DateTimeParseException: Text 'Nov 20,2016 12:00:00 AM' Could not be parsed at index 22.

在我将“ AM”更改为“ am”后,它可以正常工作! 如此LocalDateTime会因为大写字母字母而无法解析日期? 以及如何解决此问题,而无需将“ AM”替换为“ am”,将“ PM”替换为“ pm”

编辑

SimpleDateTime格式没有此问题,他忽略了a̶p̶e̶s̶字母寄存器(我的意思是大写或小写),并且我不想将Date转换为LocalDateTime

编辑2

MMM d,yyyy hh:mm:ss A将'a'替换为'A'也不起作用

解决方法

您需要以不区分大小写的方式解析它。另外,请确保使用英语语言环境(例如Locale.ENGLISHLocale.US等),因为元素名称是用相应语言环境中的本地化字符串表示的。​​

演示:

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) {
        // Given date-time string
        String strDateTime = "Nov 20,2016 12:00:00 AM";

        // Define the formatter
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                        .parseCaseInsensitive()
                                        .appendPattern("MMM d,u h:m:s a")                                       
                                        .toFormatter(Locale.ENGLISH);                                     

        // Parse the given date-time into LocalDateTime using formatter
        LocalDateTime ldt = LocalDateTime.parse(strDateTime,formatter);

        System.out.println(ldt);
    }
}

输出:

2016-11-20T00:00