我知道你已经从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
我们注意到现代类的最后一个好处:你可以有一个日期没有时间的日时,这就是你需要再次提供更精确地模拟您的需求的代码,从而留下更少的混淆空间。
问题:我可以在我的Java版本中使用现代类吗?
如果至少使用Java ,您可以。
不显示您的代码的屏幕截图。将源代码粘贴到代码块中的问题中。 – Andreas
@Andreas完成.. –
无关,但是这个'Math.abs(区别);'是NoOp。 – Henry