提问人:Gunel Hasan 提问时间:6/23/2023 最后编辑:Arvind Kumar AvinashGunel Hasan 更新时间:8/5/2023 访问量:66
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]
问:
我有一个字符串列表[2019年4月1日,2020年8月1日,2018年2月20日],我需要以相同的模式将其转换为日期格式。当我使用 SimpleDateFormat(“MMM d, yyyy”) 模式执行此操作时,我得到 Thu Aug 01 00:00:00 EDT 2019 格式。尝试使用 Joda DateTimeFormatter 和相同的结果。 任何人都可以帮忙解决吗?
答:
java.time
日期时间 API 及其格式设置 API 已过时且容易出错。建议完全停止使用它们并切换到新式日期时间 API。java.util
SimpleDateFormat
另外,下面引用的是Joda-Time主页的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
您的问题
您正在尝试将日期字符串解析为对象并打印它。对象仅表示自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。打印其对象时,将打印 Date#toString 返回的字符串,该字符串应用系统的时区。请注意,date-time 对象仅包含日期时间信息,而不包含格式。格式使用字符串表示,您可以通过使用具有所需模式的日期时间格式化类来格式化日期时间对象来获得该字符串。java.util.Date
java.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 的自定义格式。y
u
从 Trail: Date Time 了解有关新式日期时间 API 的更多信息。
评论
java.util.Date
SimpleDateFormat
LocalDate
DateTimeFormatter
LocalDate
LocalDate
Apr 1, 2019