两个日期之间的天数不基于时间

Number of days between two dates not based on time

我保存一个日期,然后使用

将其与当前日期进行比较
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
introDateTimeSaved = formatter.parseDateTime(introDateViewedString);
introDays = Days.daysBetween(introTodaysDate, introDateTimeSaved);

以确定自保存日期更新以来已经过了多少天。这是为了显示按下特定按钮的时间。问题是日子一天天过去 24 小时,我希望它纯粹几天过去。例如:

保存日期变量:2016-10-15 08:26:00

今天 日期变量 2016-10-16 08:25:00

这 return 的天数差异为 0,我的最佳猜测是因为这两个日期之间的时间是 23 小时 59 分钟。我想要这个 return 1 因为它从 15 号到 16 号相差 1 天或者 return 2 如果它是第 14 号和今天是第 16 号等

您可以使用小时数的差异,然后除以 24 并向下取整。

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
introDateTimeSaved = formatter.parseDateTime(introDateViewedString);

Period p = new Period(introDateTimeSaved, introTodaysDate);
int hours = p.getHours();
int days =  Math.floor(hours/24.0);

编辑:

间隔是使用 Joda Time library 计算的,因为 JDK Date API 很难操纵。

试试这个

int dayDifference= ((int)((startDate.getTime()/(24*60*60*1000)) - (int)(endDate.getTime()/(24*60*60*1000))));

顺便说一下,这是使用标准 java.util.Date class。

按照之前的建议应用基于小时的解决方案是危险的,而且通常是错误的。证明在夏令时变化周围选择输入(在我当地的时区 Europe/Berlin):

String introDateViewedString = "2016-03-26 00:00:00";
String introTodaysDateString = "2016-03-31 00:00:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime introDateTimeSaved = formatter.parseDateTime(introDateViewedString);
DateTime introTodaysDate = formatter.parseDateTime(introTodaysDateString);

System.out.println(introDateTimeSaved); // 2016-03-26T00:00:00.000+01:00
System.out.println(introTodaysDate); // 2016-03-31T00:00:00.000+02:00

以下代码证明基于小时的解决方案通常是错误的:

Hours hours = Hours.hoursBetween(introDateTimeSaved, introTodaysDate);
System.out.println(hours); // PT119H
System.out.println(hours.getHours() / 24); // 4 (should be 5)

下面的代码证明只使用 period.getHours() 是一个坏主意,因为该方法只产生部分数量,而忽略了所讨论的期间也可以包含其他单位的事实:

Period p = new Period(introDateTimeSaved, introTodaysDate); // P5D
System.out.println(p); // P5D
int days = p.getHours() / 24;
System.out.println(days); // 0 (period does not contain hours but days)

那么最好的方法是什么?

如果您对时钟时间不感兴趣,请使用普通日历日期!

String introDateViewedString = "2016-03-26 00:00:00";
String introTodaysDateString = "2016-03-31 00:00:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime introDateTimeSaved = formatter.parseLocalDateTime(introDateViewedString);
LocalDateTime introTodaysDate = formatter.parseLocalDateTime(introTodaysDateString);

LocalDate date1 = introDateTimeSaved.toLocalDate(); // 2016-03-26
LocalDate date2 = introTodaysDate.toLocalDate(); // 2016-03-31

System.out.println(Days.daysBetween(date1, date2).getDays()); // 5

此解决方案的另一个优点是不使用任何基于除法等的自行计算。在日期和时间的上下文中使用此类算法应该让用户敲响警钟(在大多数情况下)。