我试图为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", "EEE, dd MMM yyyy HH:mm:ss zzz");
据我所知这应该行得通,但我正在 java.text.ParseException: Unable to parse the date: Wed, 19 Aug 2020 15:28:47 GMT
这两个例子都有例外。我做错什么了?
3条答案
按热度按时间t30tvxxf1#
我看你的格式没有问题。
演示:
输出:
但是,我强烈建议您停止使用过时且容易出错的
java.util
日期时间api和SimpleDateFormat
. 切换到现代java.time
日期时间api和相应的格式api(java.time.format
). 从trail:date-time了解有关现代日期时间api的更多信息。使用现代日期时间api:
输出:
如果您的android版本不符合java-8,那么可以使用threetenbackportcheck进行backport。检查如何在android项目中使用threetenabp
c6ubokkw2#
您的格式内置于java.time中
使用
DateTimeFormatter.RFC_1123_DATE_TIME
; 它对你的两个弦都有效。它实际上是相同的格式,只是与utc(或gmt)的偏移量表示不同。DateTimeFormatter
是java.time的一部分,后者是现代java日期和时间api。我建议您更喜欢java.timeDate
以及DateUtils
,也因为Date
课程设计拙劣,过时已久。输出为:
2020-08-20t13:30:16z
让我们试试另一个字符串示例:
2020年8月19日15:28:47z
问:java.time不需要androidapi级别26吗?
java.time在较旧和较新的android设备上都能很好地工作。它至少需要Java6。
在Java8和更高版本以及更新的android设备上(api级别26),现代api是内置的。
在非android的java6和java7中获得了三个十的backport,即现代类的backport(三个十用于jsr310;请参见底部的链接)。
在旧的android上,要么使用desugaring,要么使用android版本的threeten backport。它叫3TENABP。在后一种情况下,请确保从导入日期和时间类
org.threeten.bp
有分装的。链接
oracle教程:date time解释如何使用java.time。
java规范请求(jsr)310,其中
java.time
第一次被描述。三十后港工程
java.time
到Java6和Java7(jsr-310为310)。通过desugaring提供Java8+API
threetenabp,android版threeten backport
问:如何在android项目中使用threetenabp,有非常透彻的解释。
z6psavjg3#
您的时区有两种不同的格式:https://docs.oracle.com/javase/7/docs/api/java/text/simpledateformat.html
第一个看起来是这样的:
第二种格式是: