在Java中检查MM-dd-yyyy和dd-MM-yyyy格式

时间:2013-09-27 11:50:09

标签: java

我有一些数据包含不同格式的日期,例如:yyyy-dd-MMyyyy-MM-ddEEE dd-MM-yy等。

我正试图找到区分dd-MM-yyyyMM-dd-yyyy的方法。 据我所知,如果dd小于12,我无法确定格式,但通过识别dd时的其他情况> 12,我可以尽量减少错误的计算。

我试过了 -

SimpleDateFormat targetFormat = new SimpleDateFormat("EEE, yyyy-MMM-dd hh:mm:ss a");
SimpleDateFormat originalFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat originalFormat2 = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss");

Calendar cal = Calendar.getInstance();

try {
     Date date = originalFormat1.parse(s);    //I tried with s = "2013-25-8 20:10:00";

     cal.setTime(date);

     if (cal.get(Calendar.DAY_OF_MONTH) > 12)
                date = originalFormat2.parse(s);

     System.out.println(targetFormat.format(date));
} catch (ParseException e) {
     System.out.println("Error");

输出

我在期待:Sun,2013年8月25日08:10:00 PM

但我得到了:星期四,2015年1月8日08:10:00 PM

3 个答案:

答案 0 :(得分:3)

您可以尝试:

originalFormat1.setLenient(false);
在尝试用它解析字符串之前

;这应该使它在月份数超出范围时抛出ParseException

答案 1 :(得分:0)

当您应用格式1并且它将25解释为月份时,日期开始变得怪异,这是有道理的,因为月份不能大于12.因此,您的if语句没有意义。您必须在应用SimpleDateFormat之前检查格式(例如使用Integer.parseInt(s.substring(5,7)> 12)。

答案 2 :(得分:0)

实际上它是25个月,所以12 + 12 + 1表示2年1个月,即“1月” 所以,你的日期变成:“18月1日08:20 GMT 2015”,当你把它改成“targetFormat”时,这个不寻常的结果随之而来......