【问题标题】:Parsing date incorrectly错误地解析日期
【发布时间】:2012-03-26 07:21:09
【问题描述】:

我正在尝试将输入日期字符串转换为日期格式,然后再转换为日期时间格式。 作为测试,我输入了不正确的日期格式,但这似乎并没有引发任何解析异常并且给了我错误的输出。关于我下面的代码做错了什么有什么想法吗?

            String OLD_FORMAT ="MM/dd/yyyy";
            String NEW_FORMAT ="yyyyMMdd HHmmss";
            SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT);
            String oldDateString = "03/01211/2012"; //Incorrect input
            Date myOldDate;
            Datetime myNewDate;
            try {
                myOldoldDate = sdf.parse(oldDateString); 
           //Returns Wed Jun 24 00:00:00 IST 2015...why?? 
          //Shouldn't this be throwing a parse exception?
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }
            sdf.applyPattern(NEW_FORMAT);
            //Converting date to datetime format
            try {
                myNewDate= DateHelper.toDatetime(sdf.parse((sdf.format(myOldDate)))); 
           //Returns 2015-06-24 00:00:00.0
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }

【问题讨论】:

  • 你能试试sdf.setLenient(false)吗?
  • 刚刚解决了问题
  • @Thilo 是的..我可以试试,但它的目的是什么?抱歉,Java 新手,这就是为什么 :)

标签: java validation parsing date


【解决方案1】:

"03/01211/2012" => 2015 年 6 月 24 日 00:00:00 IST ... 为什么?

我的猜测是 2015 年 6 月 24 日是 2012 年 3 月 1 日的 1211 天。 过度翻转,读作 1211 年 3 月。

您应该可以通过以下方式关闭此功能:

sdf.setLenient(false)

public void setLenient(boolean lenient)

指定日期/时间解释是否宽松。宽松解释下,“1996 年 2 月 942 日”这样的日期将被视为等同于 1996 年 2 月 1 日之后的第 941 天。严格解释下,此类日期将引发异常。

【讨论】:

    【解决方案2】:

    你可以设置严格的格式

    SimpleDateFormat.setLenient(false)

    指定日期/时间解析是否宽松。通过宽松的解析,解析器可以使用启发式方法来解释不精确匹配该对象格式的输入。使用严格解析,输入必须匹配此对象的格式。

    【讨论】:

      【解决方案3】:

      在不查看源代码的情况下,我假设 01211 被解析为 1211 天,这些天被添加到 2012-03-01 从而导致 2015-06-24。正如@Thilo 所说,sdf.setLenient(false) 应该在这里提供帮助。

      问题在于默认情况下解析器对错误输入的容忍度更高(默认开启宽松模式),因此不会在此处抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 2018-05-27
        相关资源
        最近更新 更多