用Java解析不明确的日期

时间:2009-10-12 04:04:33

标签: java

如果没有明确定义日期格式,Java中有没有办法猜测它?

例如,用户键入11Mar09或11-09-2009或11/09/2009或11-09什么是解析这个到Date对象的最佳方法,没有一堆try catch或引发错误?

4 个答案:

答案 0 :(得分:7)

我认为你不想这样做,特别是基于你的例子,但如果你必须这样做,我认为你最好的选择是在公共场所使用像Apache DateUtils这样的东西:

String[] datePatterns = new String[] {
  "ddMMMyy",    // ex. 11Mar09
  "dd-MM-yyyy", // ex. 11-09-2009
  "dd/MM/yyyy", // ex. 11/09/2009
  "dd-MM"       // ex. 11-09 
}

Date date = DateUtils.parseDate(stringDate, datePatterns);

不幸的是,像上面第四个这样的日期会有问题 - 是“11/09”9月11日,11月9日,2011年9月,2009年11月,还是其他什么?

答案 1 :(得分:5)

我的建议是不要。使用日期选择器或明确指出的格式。猜测将导致各种各样的问题,如果日期是关键的话,很容易包括诉讼。

如果 猜测,请提供某种形式的非歧义反馈,例如确认页面上写着“您的航班将于2009年11月9日预订。这是正确的吗?”。

答案 2 :(得分:2)

你可以拥有一堆正则表达式并循环直到找到匹配项。我想你也可以有一堆DateFormats并循环遍历它们,捕获那些失败的例外。

第一个避免对非特殊情况使用异常,第二个可能从设计的角度来看更好,因为你正在使用日期解析框架来设计它的目的。但总的来说,我认为这两种方法本身并不一定是“最好的”或“最差的” - 更多的是个人偏好/信仰。

答案 3 :(得分:1)

由于可能的日期字符串的域是无限的,我不知道怎样才能识别它们。但是,您可以选择模式匹配的子集。

您没有提供有关您的用户界面的线索,但这里最好的方法是帮助用户输入日期。例如,使用弹出日历或仅强制使用预定义格式。