2017-10-28 159 views
-2

我已经玩了近6个小时,现在看了其他问题,但似乎无法弄清楚我做错了什么,给了我这些奇怪的结果。这里是我的代码如下DateFormat.parse()给出错误的结果

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日有人能告诉我为什么发生这种情况。

回答

2

您传递一种简单日期格式的格式在您认为该月份的位置有几分钟定义。

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

相反,使用 YYYY/MM/DD

1

请允许我给几个是去有点超出你问什么建议。我认为我的建议应该是有帮助的。

首先,你不应该坚持长期过时的类DateSimpleDateFormatThe modern Java date and time API通常更好用,并且包含更少的令人不快的意外。它被称为JSR-310或java.time

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

最后,正如Trenton Trama在the other answer中指出的那样,格式模式字符串区分大小写。无论您使用大写字母还是小写字母,它都很重要。使用不正确的情况很可能会导致错误的结果。这既适用于过时API,也适用于现代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 

问:我可以使用现代化的API与我的Java版本?

如果至少使用Java ,您可以。