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

Apache Date utils parseDateStrictly方法无法正常工作

如何解决Apache Date utils parseDateStrictly方法无法正常工作

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

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

解决方法

java.time

我建议您将java.time用于日期和时间工作。一旦我们只有设计不良的DateUtilsDate类可以使用,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 tutorial: Date Time解释了如何使用java.time。

,

列格式为dd MMMM yyyy,应解析日期,例如28 2018年9月,并且应在诸如2018年9月28日之类的值上引发错误

DateUtils使用java.util的日期时间API及其格式API SimpleDateFormat,它们已经过时且容易出错。我建议您应该完全停止使用它们,并切换到modern date-time 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,请选中Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

,

根据以上评论,“ 2018年9月28日”不会抛出任何相位错误,如果要断言判断,也许判断java.lang.String#length足够?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。