0
DateUtils.parseDateStrictly("28 Sep 2018" , "dd MMMM yyyy")

上述日期的格式应该是 dd MMM yyyy (MMM 表示更短的月份),但是 MMMM 也会解析更短的月份,导致解析无效。我已经在使用 parseDateStrictly 方法。还有其他建议吗?

4

2 回答 2

3

java.time

我建议您将 java.time 用于您的日期和时间工作。DateUtils一旦我们只有设计不佳的类Date和可使用的类, Apache就很有用SimpleDateFormat。我们不再需要它了。很长一段时间以来,我们都不需要它。

java.time 的行为方式与您期望的开箱即用方式一样。

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
    String dateString = "28 Sep 2018";
    LocalDate.parse(dateString, dateFormatter);

结果:

Exception in thread "main" java.time.format.DateTimeParseException: Text '28 Sep 2018' could not be parsed at index 3
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.LocalDate.parse(LocalDate.java:428)
    (etc.)

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2020-10-30T17:50:42.140 回答
2

列格式为 dd MMMM yyyy,它应该解析像 2018 年 9 月 28 日这样的日期,并且应该在 2018 年 9 月 28 日这样的值上抛出错误

DateUtils使用日期时间 APIjava.util及其格式化 API,SimpleDateFormat这些 API 已过时且容易出错。我建议您应该完全停止使用它们并切换到现代日期时间 API

使用现代日期时间 API:

import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Test strings
        String[] arr = { "28 September 2018", "28 Sep 2018", "28 09 2018" };
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
        for (String s : arr) {
            try {
                LocalDate date = LocalDate.parse(s, formatter);
                // ...Process date e.g.
                System.out.println(DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH).format(date));
            } catch (DateTimeException e) {
                System.out.println(s + " is not a valid string.");
            }
        }
    }
}

输出:

September 28, 2018
28 Sep 2018 is not a valid string.
28 09 2018 is not a valid string.

在Trail: Date Time了解有关现代日期时间 API 的更多信息。

如果您正在为您的 Android 项目执行此操作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available

于 2020-10-30T22:46:05.550 回答