我有一些数据包含不同格式的日期,例如:yyyy-dd-MM
、yyyy-MM-dd
、EEE dd-MM-yy
等。
我试图找到一种方法来区分dd-MM-yyyy
和MM-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-八月-25 08:10:00 PM
但我得到了: 星期四, 2015-1月-08 08:10:00 PM
你可以试试:
originalFormat1.setLenient(false);
在尝试使用它解析字符串之前;当月份数字超出范围时,这应该会引发ParseException
。
当您应用格式 1 并将 25 解释为月份时,日期开始变得奇怪,这是有道理的,因为月份不能大于 12。因此,您的 if 语句没有意义。在应用 SimpleDateFormat 之前,您必须检查格式(例如使用 Integer.parseInt(s.substring(5,7)> 12)。
实际上它以 25 作为月,所以 12 + 12 + 1 表示 2 年零一个月,即"一月"因此,您的日期变为:"2015年1月8日星期四20:10:00 GMT",当您将其更改为"targetFormat"时,这个不寻常的结果随之而来......