我正在尝试以特定的自定义格式解析日期。
像这样......星期三2012年1月25日 - 下午12:44:07
我为此创建了SimpleDateFormat
..
SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD MMM YYYY - HH:MM:SS aa" );
问题是这些日子的字面意思。它就像25日,23日,02日一样。我对这件事感到异常......
帮助解决这个问题。
答案 0 :(得分: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);
(忽略Locale,我来自其他地方:))
答案 1 :(得分: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();
}
你的解析字符串也有一些错误。案例对于日期和时间ptterns很重要。请参阅SimpleDateFormat javadoc以获取参考。
答案 2 :(得分:1)
您将不得不以某种方式手动执行此操作。
e.g。方法如下:
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);
答案 3 :(得分:0)
将“.th”添加到格式字符串中,遵循人们在此主题中所述的内容
How do you format the day of the month to say "11th", "21st" or "23rd" in Java? (ordinal indicator)