微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用DateUtils解析日期的问题

如何解决使用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的一部分。与DateDateUtils相比,我建议您更喜欢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导入日期和时间类。

链接

,

您的时区采用两种不同的格式: 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 举报,一经查实,本站将立刻删除。