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

时间:2016-10-16 14:32:19

标签: android jodatime

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

将其与当前日期进行比较
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

这会返回0天的差异,我最好的猜测是因为这两个日期之间的时间是23小时59分钟。我希望这返回1,因为它从15日到16日相差1天,如果是14日,那么返回2,今天是16日等。

3 个答案:

答案 0 :(得分:0)

您可以使用以小时为单位的差异,然后除以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);

编辑:

Interval是使用Joda Time library计算的,因为JDK Date API操作起来很糟糕。

答案 1 :(得分:0)

试试这个

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

顺便说一句,这是使用标准的java.util.Date类。

答案 2 :(得分:0)

按照之前的建议应用基于时间的解决方案是危险的,而且经常是错误的。证明选择围绕日光节约变化的输入(在我当地时区欧洲/柏林):

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

此解决方案的优势还在于不使用基于划分数字等的任何本土计算。在日期和时间的上下文中使用此类算法应该让用户响起警报铃声(在大多数情况下)。