当我用" HH"传递日期字符串时,为什么我会得到一个约会对象?模式到SimpleDateFormat?

时间:2015-01-09 14:35:13

标签: java datetime simpledateformat

这是我的代码:

try {
  DateFormat dateFormat = new SimpleDateFormat(pattern);
  dateFormat.setLenient(false);
  Date date = dateFormat.parse(value);
  if (date != null) {
    return true;
  }
} catch (ParseException e) {}

1。)当我将值传递为" 01/07 / 2015"和" HH:mm"我正确得到了例外。

2。)然而,当我将价值传递给" 01/07 / 2015"和" HH"我得到一个" Thu Jan 01 01:00:00 EST 1970"日期对象。

除了场景#2之外,我还会抛出异常,因为给定的字符串完全不匹配给定的模式。即使设置了setLenient(false),为什么我会得到那个奇怪的日期?

3 个答案:

答案 0 :(得分:1)

JavaDoc精美地总结了为什么你没有例外:

  

抛出: ParseException - 如果无法解析指定字符串的开头。

01可以使用HH进行解析,因此也不例外。

答案 1 :(得分:1)

http://download.java.net/jdk6/archive/b104/docs/api/java/text/Format.html#parseObject(java.lang.String)

parseObject
public Object parseObject(String source)
                   throws ParseException
Parses text from the beginning of the given string to produce an object. The method may not use the entire text of the given string

我认为#1与分隔符不匹配。虽然模式是:。

,但你把它放进去了

并且#2在HH之后立即停止匹配,因为它从给定字符串的开头解析文本并且DOESN' T使用给定字符串的整个文本。

答案 2 :(得分:0)

我找到了解决这个问题的方法。 为了解决我的问题,我将整个代码包装在if语句中,我检查模式的长度是否与值的长度相同,因为它们应该在我使用此代码进行验证时:

if(StringUtils.length(pattern) == StringUtils.length(value)) {
  try {
    DateFormat dateFormat = new SimpleDateFormat(pattern);
    dateFormat.setLenient(false);
    Date date = dateFormat.parse(value);
    if (date != null) {
      return true;
    }
  } catch (ParseException e) {}
}
return false;