Я пытаюсь разобрать несколько разных строк даты для приложения 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 исключений для обоих этих примеров. Что я здесь делаю не так?

0
Florian Baierl 21 Авг 2020 в 00:44

3 ответа

Лучший ответ

Ваш формат встроен в java.time

Используйте DateTimeFormatter.RFC_1123_DATE_TIME; он работает для обеих ваших струн. Это действительно тот же формат, только смещение от UTC (или GMT) обозначено иначе. DateTimeFormatter является частью java.time, современного API даты и времени Java. Я рекомендую вам предпочесть 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-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, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На более старых версиях Android используйте Desugaring или Android-версию ThreeTen Backport. Он называется ThreeTenABP. В последнем случае убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

3
Ole V.V. 21 Авг 2020 в 05:47

Не вижу проблем с вашими форматами.

<Сильные> Демо:

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. Переключитесь на современный {{X2} } API даты и времени и соответствующий API форматирования (java.time.format). Узнайте больше о современном API даты и времени на странице Trail: Date Time .

Используя современный 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, вы можете выполнить резервное копирование с помощью ThreeTen-BackportCheck. Проверьте Как использовать ThreeTenABP в Android Project

1
Arvind Kumar Avinash 20 Авг 2020 в 22:25

Ваши часовые пояса представлены в двух разных форматах: https://docs.oracle.com/javase/ 7 / документы / 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
1
John Leehey 20 Авг 2020 в 21:51