【问题标题】:convert string to Date using strict format使用严格格式将字符串转换为日期
【发布时间】:2016-01-03 12:22:15
【问题描述】:

我需要将字符串转换为具有精确格式的日期 (dd/MM/yyyy) 我写了这个方法:

public static Date toDate(String input, String format) throws DateConverterException {
        if (StringUtils.isEmpty(input) || StringUtils.isEmpty(format)) {
            throw new DateConverterException (String.format("Input %s or format %s is empty or", input, format));
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false);
        Date date = null;
        try {
            date = sdf.parse(input);
        } catch (ParseException e) {
            throw new DateConverterException (e);
        }
        return date;
    }

所以如果输入日期是 "06/10/" ,就会抛出异常 = 好 但是如果输入日期是“06/10/1”,尽管格式不受尊重,但仍会构造日期

任何帮助将不胜感激 非常感谢

【问题讨论】:

  • 无法复制。当我测试时,这是抛出:“java.text.ParseException: Unparseable date: "06/10/0""
  • @Tunaki 真的吗?我不明白,当我使用参数进行测试时:“06/10/2”,“dd/MM/yyyy”,尽管它不应该构建日期,但它仍然是构造的
  • @azurefrog 是的,对不起,我以 0 为例,但确实抛出了异常。现在尝试使用 06/10/1 或 06/10/2,它将构造日期。谢谢
  • 一点点挖掘表明 SimpleDateFormat 在严格的日期解析方面很糟糕。 This answer 提倡解析后双重检查,this answer 有办法扩展类强制严格解析。

标签: java date


【解决方案1】:

是的,很抱歉,我以 0 为例,但确实抛出了异常。现在尝试使用 06/10/1 或 06/10/2,它将构造 Date。

来自the documentation

年份:如果格式化程序的日历是公历,则应用以下规则。

....

  • 对于解析,如果模式字母的数量超过 2 个,则按字面解释年份,不管位数多少。因此,使用“MM/dd/yyyy”、“01/11/12”模式会解析到公元 12 年 1 月 11 日

  • 为了使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat 必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建 SimpleDateFormat 实例之前的 80 年和之后的 20 年来实现这一点。例如,使用“MM/dd/yy”模式和 1997 年 1 月 1 日创建的 SimpleDateFormat 实例,字符串“01/11/12”将被解释为 2012 年 1 月 11 日,而字符串“05/04/ 64" 将被解释为 1964 年 5 月 4 日。在解析期间,只有由 Character.isDigit(char) 定义的正好包含两位数字的字符串才会被解析为默认世纪。任何其他数字字符串,例如一位数字字符串、三位或更多数字字符串或并非全为数字的两位数字字符串(例如,“-1”),都按字面意思解释。因此,“01/02/3”或“01/02/003”使用与公元 3 年 1 月 2 日相同的模式进行解析。同样,“01/02/-3”被解析为 Jan 2, 4 BC。

(我的重点)

例如,1 是有效年份。如果您只想接受一定范围内的年份(例如,1800-2100),则需要在解析后检查日期的年份。

【讨论】:

  • 非常感谢你。所以这毕竟是 SimpleDateFormat 的正常行为。除了解析之外,我会按照你的建议验证范围年份
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 2020-11-20
  • 2014-01-18
  • 2019-10-13
相关资源
最近更新 更多