0

这是一个众所周知的问题,已经出现在 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

4

2 回答 2

1

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

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

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

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

有关更多详细信息,请阅读: http ://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#year

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

于 2012-10-01T11:09:59.550 回答
0

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

您的选择是:

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

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

于 2012-10-01T10:55:32.707 回答