如何在 Java 中格式化非纯日期?

How to format a non plain date in Java?

我有两个日期需要格式化,但我收到以下异常。我的主要问题是白天部分的 th rd etc。我找不到这个问题的任何答案。我检查了所有这些链接 1,2,3,4,5 我想我应该使用 Regex 但不确定如何使用。

 10th Dec 2019 -> 2019-12-10 
 10th December 2019 -> 2019-12-10

代码

 String date1 = "10th Dec 2019";
 Date date = new SimpleDateFormat("dd MMMM YYYY").parse(date1);
 System.err.println(date);
 String date2 = new SimpleDateFormat("yyyy-mm-dd").format(date);
 System.err.println(date2);

异常

 Exception in thread "main" java.text.ParseException: Unparseable date: "10th Dec 2019"

您可以通过将它们放在模式中的单引号中来转义日期格式的显式文字,如下所示:

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1);

但是,该解决方案不支持通配符,我假设您需要 "st" 和 "nd" 后缀。因此,我建议您根据正则表达式对输入进行一些预处理,以删除 "st/nd/th" 后缀。

对于您的字符串,您可以使用:

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1);

用空字符串替换所有预期的不需要的后缀,然后解析:

    String s = "10th Dec 2019";

    SimpleDateFormat fmt = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
    Date d = fmt.parse(s.replaceFirst("th|nd|st|rd", ""));
    System.out.println("d = " + d);

您可以先删除量词,然后像往常一样解析日期。

像这样的东西会起作用:

String[] input = {     "10th Dec 2019",
                       "10th December 2019",
                       "1st December 2019",
                       "3rd December 2019"
                 };

DateFormat df = new SimpleDateFormat("dd MMMM yyyy");
DateFormat result = new SimpleDateFormat("dd-MM-yyyy");
for(String s : input) {
    s = s.replaceAll("^(\d+).{2}", "");  //The .{2} will match any two characters, which should be the th, st, nd and rd.
    System.out.println(result.format(df.parse(s)));
}

产量:

10-12-2019
10-12-2019
01-12-2019
03-12-2019

你可以这样试试:

String suffix = getSuffix(inputDate.get(Calendar.DAY_OF_MONTH));
DateFormat dateFormat = new SimpleDateFormat(" d'" + suffix + "' MMMM yyyy");
return dateFormat.format(currentCalDate.getTime());

// getSuffix
private String getSuffix(int inputDay) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    switch (day % 10) {
        case 1:
            return "st";
        case 2:
            return "nd";
        case 3:
            return "rd";
        default:
            return "th";
    }
}

在 Java 7 中,使用 Joda time for handling dates. So I recommend you look into it. The api is way easier to use then Date 被认为是最佳实践。 (也解析)

当您稍后迁移到 Java 8 时,java.time (JSR-310) 包基于 Joda Time,因此您可以轻松迁移。