错误的解析日期

时间:2016-11-20 07:53:25

标签: java netbeans

我的代码:

DateFormat format = new SimpleDateFormat("dd/MM/YYYY");

Date Today = format.parse(today);
Date Date = format.parse(date);

difference = (Date.getTime() - Today.getTime()) / 86400000;
Math.abs(difference);
System.out.println(String.valueOf("date" + date));
System.out.println(String.valueOf("date" + Date));
System.out.println(String.valueOf("date" + today));
System.out.println(String.valueOf("date" + Today));

输出:
date29 /二千零十六分之十一
dateSun Dec 27 00:00:00 GMT + 08:00 2015
date20 /二千零十六分之十一
dateSun Dec 27 00:00:00 GMT + 08:00 2015

我在解析日期时遇到问题,原始日期是 29/11/2016 ,但是在解析时,日期变为 Sun Dec 27 00:00:00 GMT + 08: 00 2015

这个问题出现在我的整个程序中,并且与日期有关。

enter image description here

2 个答案:

答案 0 :(得分:1)

格式dd / MM / YYYY应为dd / MM / yyyy。参见SimpleDateFormat的javadoc:y =年,Y =周年。 - Andreas 12分钟前

谢谢你解决了。

答案 1 :(得分:1)

我知道你已经从Andreas’ comment获得了解决方案。我想在这里做的是退后一步并建议对代码进行一些改进。随意忽略。

  1. 最重要的是,我建议你将过时的课程DateDateFormatSimpleDateFormat抛弃,并开始使用他们的现代替代课程。这些在2014年初的java.time包中出现。这些也提供了一种更简单明了的计算差异的方法。
  2. 遵循约定,即变量名称以小写字母开头。具体来说,在同一个源文件中使用名为Date的类,两个名为dateDate的变量必然会引起混淆。
  3. 和亨利一样,我也认为你打算difference = Math.abs(difference);
  4. 您对String.valueOf()的来电是多余的,似乎让代码更难以阅读。放下它们。
  5. 为了举例,在我建议的代码中,我故意使用错误的日期格式模式字符串dd/MM/YYYY

        DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/YYYY");
    
        LocalDate todayAsLocalDate = LocalDate.parse(today, format);
        LocalDate dateAsLocalDate = LocalDate.parse(date, format);
    
        difference = ChronoUnit.DAYS.between(todayAsLocalDate, dateAsLocalDate);
        difference = Math.abs(difference);
        System.out.println("date " + date);
        System.out.println("date " + dateAsLocalDate);
        System.out.println("date " + today);
        System.out.println("date " + todayAsLocalDate);
        System.out.println(difference);
    

    正如代码现在所示,它会抛出java.time.format.DateTimeParseException: Text '20/11/2016' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2016, MonthOfYear=11, DayOfMonth=20},ISO of type java.time.format.Parsed。当代码不正确时,我更喜欢异常而不是可能不被注意的错误结果。所以这比SimpleDateFormat给你的好。

    虽然消息不易阅读,但要注意的是WeekBasedYear。基于周的年份仅适用于周数,您不打算使用周数。如果您与the documentation进行比较,您会发现模式中的大写Y是基于周的年份,而小写y是年代。所以,让我们纠正:

        DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    

    现在代码打印出来了:

    date 29/11/2016
    date 2016-11-29
    date 20/11/2016
    date 2016-11-20
    9
    

    我们注意到现代课程的最后一个优势:您可以在没有时间的情况下获得所需的日期,再次提供能够更准确地模拟您的要求的代码,从而减少混淆的空间。 / p>

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

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