SimpleDateFormat(“MMM d, yyyy”) 返回 Weekday Month day 00:00:00 EDT year [duplicate]

SimpleDateFormat("MMM d, yyyy") returns Weekday Month day 00:00:00 EDT year [duplicate]

提问人:Gunel Hasan 提问时间:6/23/2023 最后编辑:Arvind Kumar AvinashGunel Hasan 更新时间:8/5/2023 访问量:66

问:

我有一个字符串列表[2019年4月1日,2020年8月1日,2018年2月20日],我需要以相同的模式将其转换为日期格式。当我使用 SimpleDateFormat(“MMM d, yyyy”) 模式执行此操作时,我得到 Thu Aug 01 00:00:00 EDT 2019 格式。尝试使用 Joda DateTimeFormatter 和相同的结果。 任何人都可以帮忙解决吗?

Java 简单日期 date-format 日期格式 解析

评论

0赞 Anonymous 8/5/2023
首先,我强烈建议您避免使用 and 类。它们总是很麻烦,而且早已过时。使用 和 from java.time,即现代 Java 日期和时间 API。其次,我建议您将数据模型和表示分开。它属于模型中的哪一天,并且用 .例如,为了演示,请根据用户的喜好将 back 转换为字符串。java.util.DateSimpleDateFormatLocalDateDateTimeFormatterLocalDateLocalDateApr 1, 2019

答:

2赞 Arvind Kumar Avinash 8/5/2023 #1

java.time

日期时间 API 及其格式设置 API 已过时且容易出错。建议完全停止使用它们并切换到新式日期时间 APIjava.utilSimpleDateFormat

另外,下面引用的是Joda-Time主页的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

您的问题

您正在尝试将日期字符串解析为对象并打印它。对象仅表示自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。打印其对象时,将打印 Date#toString 返回的字符串,该字符串应用系统的时区。请注意,date-time 对象仅包含日期时间信息,而不包含格式。格式使用字符串表示,您可以通过使用具有所需模式的日期时间格式化类来格式化日期时间对象来获得该字符串。java.util.Datejava.util.Date

使用 java.time(现代日期时间 API)的解决方案:

public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("Apr 1, 2019", "Aug 1, 2020", "Feb 20, 2018");
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d, uuuu", Locale.ENGLISH);
        list.forEach(s -> {
            LocalDate date = LocalDate.parse(s, dtf);
            System.out.printf("Default format: %s, Custom format: %s%n", date, date.format(dtf));
        });
    }
}

输出:

Default format: 2019-04-01, Custom format: Apr 1, 2019
Default format: 2020-08-01, Custom format: Aug 1, 2020
Default format: 2018-02-20, Custom format: Feb 20, 2018

在线演示

注意:在这里,您可以使用代替,但我更喜欢 u 而不是 y。此外,切勿将 DateTimeFormatter 用于没有 Locale 的自定义格式yu

Trail: Date Time 了解有关新式日期时间 API 的更多信息。