微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DateTimeFormatter的日期格式问题

如何解决DateTimeFormatter的日期格式问题

我的日期格式如下: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

有人可以帮助我吗?

解决方法

两个独立的问题:

计数错误

您正在使用例如MM是明确的:始终为全数字,零填充。您的字符串不是那样,而只是数字。因此,将其设为M/d/uuuu h:m:s a

编辑:感谢@deHaar,将yyyy更改为uuuu。推论:yyyy或uuuu无关紧要,但是请注意,这表示必填4个数字。差异会在0之前的几年内开始出现:uuuu变为负数,yyyy不会,并且期望您使用例如GG,以便您获得44 BC而不是-44。这样一来uuuu就更正确了,尽管通常不会出现差异。

缺少语言环境

第二个问题是您应该切勿使用此版本的ofPattern-它有一个bug,您无法在单元测试中找到它,因此该bug这是“较重”的数千倍,因此是一个真正的问题。

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

放在一起

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

效果很好。

,
  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
,

在您的代码段中:

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

,

根据documentation of DateTimeFormatter

数字:如果字母数为一个,则使用最小位数输出该值,并且不带填充。否则,将数字的位数用作输出字段的宽度,并在必要时将值补零。

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

DateTimeFormatter.ofPattern("M/d/yyyy h:m:s a")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。