使用dateutils解析日期的问题

e5nqia27  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(435)

我试图为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 这两个例子都有例外。我做错什么了?

t30tvxxf

t30tvxxf1#

我看你的格式没有问题。
演示:

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, "EEE, dd MMM yyyy HH:mm:ss Z",
                    "EEE, 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 . 切换到现代 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, 19 Aug 2020 15:28:47 GMT", "Thu, 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,那么可以使用threetenbackportcheck进行backport。检查如何在android项目中使用threetenabp

c6ubokkw

c6ubokkw2#

您的格式内置于java.time中

使用 DateTimeFormatter.RFC_1123_DATE_TIME ; 它对你的两个弦都有效。它实际上是相同的格式,只是与utc(或gmt)的偏移量表示不同。 DateTimeFormatter 是java.time的一部分,后者是现代java日期和时间api。我建议您更喜欢java.time Date 以及 DateUtils ,也因为 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年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,有非常透彻的解释。

z6psavjg

z6psavjg3#

您的时区有两种不同的格式: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", "EEE, dd MMM yyyy HH:mm:ss z

相关问题