2

我有一些数据包含不同格式的日期,例如:yyyy-dd-MM、、yyyy-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");

输出

我期待:2013 年 8 月 25 日星期日 08:10:00 PM

但我得到了 : Thu, 2015-Jan-08 08:10:00 PM

4

3 回答 3

4

你可以试试:

originalFormat1.setLenient(false);

在您尝试用它解析字符串之前;这应该使它ParseException在月份数超出范围时抛出 a 。

于 2013-09-27T12:00:18.347 回答
0

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

于 2013-09-27T11:59:35.593 回答
0

嘿实际上它需要 25 个月,所以 12 + 12 + 1 意味着 2 年零一个月,即“一月”所以,你的日期变成:“Thu Jan 08 20:10:00 GMT 2015”,当你改变它时进入 "targetFormat" ,这个不寻常的结果随之而来......

于 2013-09-27T13:54:15.607 回答