日期格式转换在Java中无法正常工作

时间:2012-10-01 10:37:16

标签: java validation simpledateformat

这是一个众所周知的问题,已经出现在stackoverflow上。 我被要求解决Web应用程序中的错误。 我有一个来自网络表单的日期,用户应该以给定格式dd/MM/yyyy输入有效日期。

应用程序使用Struts 1.3作为框架,这是我在相应FormBean的validate方法中找到的。

DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy", aLocale ); 
try{
     mydate = dateFormat.parse( formDate );
}
catch( ParseException pe ){
     errors.add( "error", new ActionError( "error.date.invalid" ) );
}

然而,如果用户以短格式输入年份,即01/10/12,将其转换为日期,在数据库中查找01/10/0012,则会发生错误。

作为快速修复,我尝试使用setLenient(false),但仍然没有引发异常,并且mydate仍会导致有效但错误的日期。

在搞乱正则表达式和字符串预解析之前,我想知道我是否遗漏了一些东西。特别是在日期格式实例化中使用语言环境时。

项目中使用的当前Jdk为1.5

2 个答案:

答案 0 :(得分:1)

您可以使用格式模式,如:

DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yy", aLocale ); 

因此它会将“01/11/12”转换为2012年1月11日,将“01/11/86”转换为1986年1月11日

如果年份采用“yyyy”格式,则无论数字位数如何,都会按字面解释年份。

欲了解更多详情,请阅读: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#year

或者您可以使用jd / Java代码处理“dd / mm / yyyy”格式的用户输入。禁止用户仅以“dd / mm / yyyy”格式输入日期。

答案 1 :(得分:0)

问题是01/10/12 确实满足dd/MM/yyyy。只是它(正如你所发现的)指的是公元12年。

您的选择是:

  1. 进行前端过滤(不允许日期字符串短于10个字符或以其他方式确保年份在合理范围内。)也许让JavaScript评估日期,如果在1900之前(或任何看似很好的截止)显示用户的错误(或自动修复,如果这似乎更可取,请参阅2以解决问题)
  2. 在解析日期之后评估日期对象并“修复”任何明确输入的年份只有两个字符(这可能很棘手;如何处理从19XX到20XX的截止?)。
  3. 为某些截止日期之前的任何日期返回一个异常(可能由UI处理)(可能最好与某些客户端验证一起使用)
  4. 仅允许通过网络小部件(日期选择器)输入日期。
  5. 我的投票将是1和3.1的组合,用于启用JavaScript的情况,3用于处理JS验证失败的罕见情况。