【问题标题】:Two-digit year in SimpleDateFormatSimpleDateFormat 中的两位数年份
【发布时间】:2015-05-22 13:34:03
【问题描述】:

也许这个问题很傻,但我没有找到任何让我满意的答案。

我有一个 SimpleDataFormat,例如:

sdf = new SimpleDateFormat("dd/MM/yyyy");

如果我尝试解析如下日期:10/10/15

那么日期结果是 15 年,而不是 2015 年。

为什么parse 在这种情况下有效?我期待一个ParseException

如何强制用户以 4 位格式输入年份? (请不要String.length()

我正在使用setLenient(false)

【问题讨论】:

  • 嗯,看来你确实是一年了15 是不是一个有效的日期?
  • @gtgaxiola 不,我在问为什么用两位数的解析工作。我希望它失败,我想强制使用四位数年份的日期
  • 知道了。那么Date 一直是“不确定的”。如果我可以引用加勒比海盗的话,格式“更像是你所说的'指南'而不是实际规则”。
  • 来自Javadoc of SimpleDateFormatFor parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.
  • @gtgaxiola 谢谢 :) 我想我会使用字符串长度。

标签: java date simpledateformat


【解决方案1】:

您的日期是按字面意思解释的。每http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

"解析时,如果模式字母的个数大于2,则 year 是按字面意思解释的,与位数无关。所以 使用模式“MM/dd/yyyy”,“01/11/12”解析到公元 12 年 1 月 11 日”

这也是您没有得到预期异常的原因。

【讨论】:

    【解决方案2】:

    这是因为当您说dd/MM/yyyy 时,java 期望您提供“全年”,但不一定必须是 4 位数的年份。它类似于MMMMM - 这并不意味着您只需要月份的 5 个字符,而是意味着您需要完整的月份名称。我相信您将不得不使用 String.length(),或者您可以解析它并检查日期范围。

    【讨论】:

    • 为什么java不期望'完整的单词年'?要指定 15 年,我可以简单地写 0015。为什么不是这样?
    • @JohnnyWiller 因为……这就是 Sun / Oracle 的人设计它的方式。我们无法告诉你他们当时的想法……
    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2010-12-11
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多