2012-10-01 46 views
0

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

该应用程序使用Struts 1.3作为框架,这就是我在验证相应FormBean的方法时所发现的。

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

+0

“aLocale”的价值是什么? – Azodious

+0

你可以看看http://stackoverflow.com/questions/226910/how-to-sanity-check-a-date-in-java,它有一些想法可能有帮助 – MadProgrammer

回答

0

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

的选项有:

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

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

+0

嗯,我期待setLenient做一个关于输入格式的检查,而不是添加两个零。我无法更改前端架构,所以我想我必须使用正则表达式解析。 – Leonardo

1

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

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

所以它会转换 “01/11/12”,以2012年1月11日和 “86年1月11日”,以1986年1月11日

如果Year是“yyyy”格式而不是字面解释年份,则无论数字的位数如何。

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

或者,你可以处理在JavaScript/Java代码中用户输入 “DD/MM/YYYY” 格式。限制用户只能以“dd/mm/yyyy”格式输入日期。

+0

+1 - 今天我学到了一些新东西... –

相关问题