【问题标题】:DateFormat.parse() giving wrong result [closed]DateFormat.parse() 给出错误的结果[关闭]
【发布时间】:2017-10-28 20:49:51
【问题描述】:

我已经玩了将近 6 个小时,并查看了其他问题,但似乎无法弄清楚我做错了什么,这给了我这些奇怪的结果。下面是我的代码

    String dateStr = "20171230";
    StringBuilder sb = new StringBuilder();
    sb.append(dateStr.subSequence(0, 4))
        .append("/")
        .append(dateStr.substring(4,6))
        .append("/")
        .append(dateStr.substring(6,8));

    dateStr = sb.toString();

    System.out.println("date string is " + dateStr);

    DateFormat df = new SimpleDateFormat("yyyy/mm/dd");

    df.setLenient(false);

    Date Date = null;

    try {
        Date = df.parse(dateStr);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Date is " + Date);

输出是

date string is 2017/12/30
Date is Mon Jan 30 00:12:00 CST 2017

日期应该是 12 月 30 日,而不是 1 月 30 日。谁能告诉我为什么会这样。

【问题讨论】:

    标签: java date simpledateformat date-parsing


    【解决方案1】:

    您传递的格式是一种简单的日期格式,在您认为月份所在的位置定义了分钟。

    注意时间输出如何设置为 00:12。

    相反,使用 年年/月/日

    【讨论】:

      【解决方案2】:

      请允许我提出一些建议,这些建议超出了您所询问的范围。我认为我的建议应该会有所帮助。

      首先,您不应该坚持使用早已过时的课程DateSimpleDateFormatThe modern Java date and time API 通常更易于使用,并且包含更少的令人不快的惊喜。它被称为 JSR-310 或 java.time

      其次,在从中提取日期之前,无需使用StringBuilder 重新格式化您的字符串。 20171230 可以直接解析成日期。更糟糕的是,您转换字符串的方式并没有验证长度:如果碰巧是 9 位而不是 8 位,您会想要捕获它并抛出异常,但您的代码只需要前 8 位数字并且如果还有更多则忽略。

      最后,正如 Trenton Trama 在the other answer 中已经指出的那样,格式模式字符串区分大小写。是否以及在何处使用大写或小写字母很重要。使用不正确的大小写很可能导致不正确的结果。这适用于过时的和现代的 API。幸运的是,在解析方面,现代 API 更倾向于在您使用错误大小写时抛出异常,因此至少您会被告知有问题。

      最后,当您希望其他人阅读您的代码时,就像其他 stackoverflowers 一样,请使用编码约定来帮助我们。变量名以小写字母开头。当您有一个名为 Date 的类和一个也名为 Date 的变量时,这尤其令人困惑。

      以上总结为:

          DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd");
          String dateStr = "20171230";
          LocalDate date = LocalDate.parse(dateStr, dtf);
          System.out.println("Date is " + date);
      

      输出是:

      Date is 2017-12-30
      

      问题:我可以在我的 Java 版本中使用现代 API 吗?

      如果至少使用 Java 6,则可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 2016-08-29
        • 2011-11-15
        • 2019-02-06
        • 2014-01-30
        • 2018-08-01
        • 2016-08-30
        相关资源
        最近更新 更多