日期开始日期在结束日期之前的当天差异

时间:2018-04-08 16:54:09

标签: java android time date-difference java.util.calendar

我有两个日历日期,我可以得到天数,小时数和分钟数之间的差异。

如果结束日期大于开始日期,则此方法非常有效。 如果开始日期与结束日期的星期几相同,但是比结束日期早的时间,则无效的是。 例如:结束日期星期六下午2:20,开始日期是星期六下午7:20。 它计算的时间为0天和5小时。但是,它应该更像是7天。

这是代码

    long t1 = curCal.getTimeInMillis();
    long t2 = setCal.getTimeInMillis();

    if(t2 < t1){
         days = t1-t2;
    }else{
         days = t2-t1;
    }

    long toDays = TimeUnit.MILLISECONDS.toDays(days);
    long toHours = TimeUnit.MILLISECONDS.toHours(days) % 24;
    long toMinutes = TimeUnit.MILLISECONDS.toMinutes(days) % 60;
    String toastMessage =   String.format(" %d Days %d Hours %d Minutes", toDays, toHours, toMinutes);
    Toast.makeText(context, "ALARM in"  + " " + toastMessage , Toast.LENGTH_LONG).show();

我如何处理结束日期与开始日期相同的情况,但结束日期是开始日期之前的时间?

由于

修改

我想我解决了我的问题。我正在为其他有同样问题的人添加它。如果结束日期= startdate(当天)将7添加到日历对象以获取enddate。伪码

if (enddate == startdate)) {
   enddate.add(Calendar.DAY_OF_YEAR, 7);
}

2 个答案:

答案 0 :(得分:1)

    ZoneId zone = ZoneId.of("Europe/Busingen");

    DayOfWeek alarmDay = DayOfWeek.SUNDAY;
    LocalTime alarmTime = LocalTime.of(14, 20);
    ZonedDateTime now = ZonedDateTime.now(zone);

    ZonedDateTime alarmDateTime = now.with(alarmDay).with(alarmTime);
    if (alarmDateTime.isBefore(now)) {
        alarmDateTime = alarmDateTime.plusWeeks(1);
    }
    Duration difference = Duration.between(now, alarmDateTime);
    String toastMessage = String.format(" %d Days %d Hours %d Minutes",
            difference.toDaysPart(), difference.toHoursPart(), difference.toMinutesPart());
    System.out.println(toastMessage);

刚刚跑步(周日22:03:17在Büsingen)我得到了:

  

6天16小时16分钟

我相信我提供的答案不仅是现代的,而且是更强大的答案。

  • 现代Calendar课程已经过时了,今天的标准很难设计。相反,我使用并推荐java.time,即现代Java日期和时间API。
  • 强大:据我所知,您的代码不仅在今天和闹钟日期是一周的同一天时出现问题,而且如果警报发生在早些时候周。我考虑到了这一点。
  • 此外准确:如果您在夏令时(DST)之间交叉过渡,则在计算中使用毫秒值时可能会得到错误的小时数。使用两个ZonedDateTime对象可以最大限度地减少意外。它确实要求你填写我所在的时间区域,因为夏季时间过渡是特定于时区的,所以我放置了Europe / Busingen。
  • 此外更精确地建模:使用Calendar,一个日期和时间,每周重复发出警报似乎有点滑稽。你需要的是一周中的一天和一天中的时间,所以我使用它。 java.time提供所需的课程,DayOfWeek枚举和LocalTime课程。

我实际上是如此现代,以至于我使用了Java 9中引入的toXxxPart类的Duration方法。如果您还没有使用Java,请格式化Duration 9您需要先从持续时间中减去天数来减去时间:使用minusDays方法。然后与minusHours类似地获取会议记录。

    long toDays = difference.toDays();
    difference = difference.minusDays(toDays);
    long toHours = difference.toHours();
    difference = difference.minusHours(toHours);
    long toMinutes = difference.toMinutes();

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:0)

以另一种方式阅读您的问题,如果t1是开始日期且t2是结束日期,那么您的逻辑不包括t1 < t2t2 - t1&lt的情况; 1.在这种情况下,您需要在天数中添加7。类似的东西:

long t1 = curCal.getTimeInMillis();
long t2 = setCal.getTimeInMillis();

if(t2 < t1){
     days = t1-t2;
}else{
     days = t2-t1;
     if (days < 1) {
         days += 7;
     }
}

所有这一切都可以简化为

days = Math.abs(t1 - t2);
if (days < 1 && t1 < t2) {
    days += 7;
}