我的代码:
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 。
这个问题出现在我的整个程序中,并且与日期有关。
答案 0 :(得分:1)
格式dd / MM / YYYY应为dd / MM / yyyy。参见SimpleDateFormat的javadoc:y =年,Y =周年。 - Andreas 12分钟前
谢谢你解决了。
答案 1 :(得分:1)
我知道你已经从Andreas’ comment获得了解决方案。我想在这里做的是退后一步并建议对代码进行一些改进。随意忽略。
Date
,DateFormat
和SimpleDateFormat
抛弃,并开始使用他们的现代替代课程。这些在2014年初的java.time
包中出现。这些也提供了一种更简单明了的计算差异的方法。Date
的类,两个名为date
和Date
的变量必然会引起混淆。difference = Math.abs(difference);
。String.valueOf()
的来电是多余的,似乎让代码更难以阅读。放下它们。为了举例,在我建议的代码中,我故意使用错误的日期格式模式字符串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 ,则可以。