Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期格式转换在Java中未按预期工作_Java_Validation_Simpledateformat - Fatal编程技术网

日期格式转换在Java中未按预期工作

日期格式转换在Java中未按预期工作,java,validation,simpledateformat,Java,Validation,Simpledateformat,这是stackoverflow上已经出现的一个众所周知的问题。 我被要求解决web应用程序中的一个bug。 我有一个来自web表单的日期,用户应该以给定格式输入一个有效日期dd/MM/yyyy 应用程序使用Struts 1.3作为框架,这是我在相应FormBean的validate方法中发现的 DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy", aLocale ); try{ mydate = dateFormat.

这是stackoverflow上已经出现的一个众所周知的问题。 我被要求解决web应用程序中的一个bug。 我有一个来自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
,它被转换为日期,并在我找到的数据库中查找时,不会引发错误

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

在处理正则表达式和字符串预解析之前,我想知道我是否遗漏了什么。尤其是在日期格式实例化中使用区域设置时


项目中当前使用的Jdk是1.5

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

你的选择是:

  • 让前端过滤(不允许小于10个字符的日期字符串,或确保年份在合理范围内)。可能让JavaScript计算日期,如果1900年之前(或任何看起来不错的截止日期)向用户显示错误(或自动修复,如果这似乎更可取,请参阅2了解相关问题)
  • 在解析日期并“修复”仅用两个字符明确输入的任何年份后,评估date对象(这可能很棘手;如何处理从19XX到20XX的截止日期?)
  • 返回截止日期之前的任何日期的异常(可能由UI处理)(可能最好与客户端验证结合使用)
  • 仅允许通过web小部件(日期选择器)输入日期

  • 我投票赞成1和3的组合。1用于启用JavaScript的情况,3用于处理JS验证失败的罕见实例。

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

    DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yy", aLocale ); 
    
    因此,它将“2012年11月1日”转换为2012年1月11日,“1986年11月1日”转换为1986年1月11日

    如果年份为“yyyy”格式,则不管位数多少,年份都会按字面解释

    欲了解更多详情,请阅读:


    或者,您可以处理“dd/mm/yyyy”格式的javascript/Java代码中的用户输入。Restrict用户只能以“dd/mm/yyyy”格式输入日期。

    您可以查看,它有许多想法可能会有所帮助。我希望setLenient也能检查输入格式,而不是添加两个零。我不能改变前端架构,所以我想我必须使用regex预解析。