7

我需要使用日期模式“yyyy-MM-dd”从输入字符串中解析日期,如果日期将以任何其他格式出现,则抛出错误。

这是我解析日期的一段代码:

private void validateDate() throws MyException {
  Date parsedDate;
  String DATE_FORMAT = "yyyy-MM-dd";
  try{
    parsedDate = new SimpleDateFormat(DATE_FORMAT).parse(getMyDate());
    System.out.println(parsedDate);
  } catch (ParseException e) {
    throw new MyException(“Error occurred while processing date:” + getMyDate());
  }

}

当我在 myDate 中输入像“2011-06-12”这样的字符串时,我会得到输出“Thu Sep 29 00:00:00 EEST 2011”,这很好。

当我发送像“2011-0612”这样的错误字符串时,我收到了预期的错误。

当我尝试传递仍然有两个“连字符”但位数错误的字符串时,问题就开始了。例子:

输入字符串“2011-06-1211”结果“Tue Sep 23 00:00:00 EEST 2014”。

输入字符串“2011-1106-12”结果“Mon Feb 12 00:00:00 EET 2103”。

我无法更改字符串日期的输入格式。

我怎样才能避免它?

4

2 回答 2

10

你试过打电话setLenient(false)给你的SimpleDateFormat吗?

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String[] args) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        format.setLenient(false);
        Date date = format.parse("2011-06-1211"); // Throws...
        System.out.println(date);
    }
}

请注意,我还建议设置您的SimpleDateFormat. (或者,使用Joda Time代替......)

于 2012-05-15T17:49:51.230 回答
0

同样的问题,我注意到当我直接在 main 方法中使用此代码时,它返回正确的日期,当我通过单独的方法使用相同的代码时,它返回不正确的日期

String string = "03/01/2015";
DateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
Date date1 = format.parse(string);
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(date));

返回错误日期的函数中的代码

public Date isValidDate(String dateToValidate, String dateFormat){

  if(dateToValidate == null){
     return null;
  }

  DateFormat format = new SimpleDateFormat(dateFormat,Locale.ENGLISH);
  //format.setLenient(false);

  Date date;
  try {

      date = format.parse(dateToValidate);

  } catch (ParseException e) {

      e.printStackTrace();
      return null;
  }

  return date;
}
于 2020-03-29T22:51:01.350 回答