3

我正在尝试以特定的自定义格式解析日期。

2012 年 1 月 25 日星期三 - 下午 12:44:07

像这样..

SimpleDateFormat我为此创建了一个..

SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD MMM YYYY - HH:MM:SS aa" );

问题是这些日子的文字。它就像 25 日、23 日、02 日一样到来。我对这件事感到异常......

帮助如何克服这个问题。

4

4 回答 4

3

您可以使用这样的正则表达式删除当天的文字。

String dateString = "WEDNESDAY 25th JAN 2012 - 12:44:07 PM";
SimpleDateFormat format = new SimpleDateFormat("EEEEEEE dd MMM yyyy - HH:mm:ss aa", new Locale("EN"));
dateString = dateString.replaceAll("(.*[0-9]{1,2})(st|nd|rd|th)(.*)", "$1$3");
Date parsedDate = format.parse(dateString);

System.out.println(parsedDate);

(忽略语言环境,我来自其他地方:))

于 2012-02-01T19:53:34.813 回答
2

您可以将尝试解析的日期字符串拆分为多个部分,并通过以下方式删除有问题的两个字母:

String text = "WEDNESDAY 21st JAN 2012 - 12:44:07 PM";
String[] parts = text.split(" ", 3);  // we only need 3 parts. No need splitting more
parts[1] = parts[1].substring(0, 2);
String parseableText = String.format("%s %s %s", parts[0], parts[1], parts[2]);  
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss aa" );

try {
    java.util.Date dt = sdf.parse(parseableText);
} catch (ParseException e) {
    e.printStackTrace();
}

您的解析字符串也有一些错误。大小写对于日期和时间字符很重要。请参阅SimpleDateFormat javadoc以获取参考。

于 2012-02-01T19:26:50.793 回答
1

您将不得不以某种方式手动执行此操作。

例如一个方法如下:

public static String makeItParseable(String dateStr) {
    if(dateStr.contains("st ")) {
        return dateStr.replace("st ", " ");
    } else if(dateStr.contains("nd ")) {
        return dateStr.replace("nd ", " ");
    } else if(dateStr.contains("rd ")) {
        return dateStr.replace("rd ", " ");
    } else {
        return dateStr.replace("th ", " ");
    }
}

并使用它使输入字符串可解析:

String dateStr = "WEDNESDAY 1st JAN 2012 - 12:44:07 PM";
dateStr = makeItParseable(dateStr);
DateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss a");
Date date = dateFormat.parse(dateStr);
于 2012-02-01T19:42:07.370 回答
0

按照人们在此线程中的说明,将“.th”添加到格式字符串

如何在 Java 中将月份中的日期格式化为“11 日”、“21 日”或“23 日”?(序数指标)

于 2012-02-01T19:03:00.537 回答