如何解决使用DateUtils解析日期的问题
我正在尝试为Android应用程序解析各种略有不同的日期字符串。
两个例子是:
Thu,20 Aug 2020 13:30:16 +0000
Wed,19 Aug 2020 15:28:47 GMT
这是我尝试解析这些字符串的方式:
Date pubDate = org.apache.commons.lang3.time.DateUtils.parseDate(dateString,"EEE,dd MMM yyyy HH:mm:ss Z",dd MMM yyyy HH:mm:ss zzz");
据我所知这应该可行,但是这两个示例都出现了java.text.ParseException: Unable to parse the date: Wed,19 Aug 2020 15:28:47 GMT
异常。我在这里做什么错了?
解决方法
您的格式已内置到java.time中。
使用DateTimeFormatter.RFC_1123_DATE_TIME
;它适用于您的两个字符串。它的格式实际上是相同的,只是与UTC(或GMT)的偏移量表示不同。 DateTimeFormatter
是现代Java日期和时间API java.time的一部分。与Date
和DateUtils
相比,我建议您更喜欢java.time,这也是因为Date
类的设计欠佳且已过时。
String s = "Thu,20 Aug 2020 13:30:16 +0000";
OffsetDateTime dt = OffsetDateTime.parse(s,DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(dt);
输出为:
2020-08-20T13:30:16Z
让我们尝试另一个字符串示例:
String s = "Wed,19 Aug 2020 15:28:47 GMT";
2020-08-19T15:28:47Z
问题:java.time是否不需要Android API级别26?
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
- 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
- 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
- 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类。
链接
- Oracle tutorial: Date Time解释如何使用java.time。
- Java Specification Request (JSR) 310,其中首先描述了
java.time
。 - ThreeTen Backport project,即
java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。 - Java 8+ APIs available through desugaring
- ThreeTenABP,Android版本的ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project,其中有非常详尽的解释。
您的时区采用两种不同的格式: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
第一个看起来像这样:
EEE,dd MMM yyyy HH:mm:ss Z","EEE,dd MMM yyyy HH:mm:ss Z
第二种格式为:
EEE,dd MMM yyyy HH:mm:ss z
,
我看不到您的格式有任何问题。
演示:
import java.text.ParseException;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
String[] dateStrings = { "Wed,19 Aug 2020 15:28:47 GMT","Thu,20 Aug 2020 13:30:16 +0000" };
for (String dateString : dateStrings) {
Date pubDate = org.apache.commons.lang3.time.DateUtils.parseDate(dateString,dd MMM yyyy HH:mm:ss zzz");
System.out.println(pubDate);
}
}
}
输出:
Wed Aug 19 16:28:47 BST 2020
Thu Aug 20 14:30:16 BST 2020
但是,我强烈建议您停止使用过时且容易出错的java.util
日期时间API和SimpleDateFormat
。切换到modern java.time
日期时间API和相应的格式API(java.time.format
)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。
使用现代日期时间API:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test strings
String[] dateStrings = { "Wed,20 Aug 2020 13:30:16 +0000" };
// Define formatter
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("[EEE,dd MMM yyyy HH:mm:ss Z][EEE,dd MMM yyyy HH:mm:ss zzz]",Locale.ENGLISH);
for (String dateString : dateStrings) {
ZonedDateTime zdt = ZonedDateTime.parse(dateString,formatter);
System.out.println(zdt);
}
}
}
输出:
2020-08-19T15:28:47Z[GMT]
2020-08-20T13:30:16Z
如果您的android版本不兼容Java-8,则可以使用ThreeTen-BackportCheck向后移植。选中How to use ThreeTenABP in Android Project
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。