0

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

如果结束日期大于开始日期,这将非常有效。如果开始日期与结束日期在一周中的同一天,但比结束日期更早,则不起作用。例如:结束日期为星期六下午 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();

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

谢谢

编辑

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

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

2 回答 2

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)我得到:

6 天 16 小时 16 分钟

我相信我正在贡献的答案不仅是现代的,而且是更强大的。

  • 现代Calendar课程早已过时,按照今天的标准设计得很差。相反java.time,我使用并推荐现代 Java 日期和时间 API。
  • 鲁棒性:据我所知,您的代码不仅在今天和闹钟日期是一周中的同一天时存在问题,而且如果闹钟在一周的早些时候出现问题。我考虑到了这一点。
  • 准确:如果您在夏令时 (DST) 之间进行交叉转换,则在计算中使用毫秒值时可能会得到错误的小时数。在这里使用两个ZonedDateTime对象可以最大程度地减少意外。它确实需要您填写我放置欧洲/布辛根的所需时区,因为夏季时间转换是特定于时区的。
  • 此外更精确地建模:使用 a Calendar,日期和时间,每周重复警报似乎有点有趣。您需要的是一周中的某一天和一天中的某个时间,所以我使用它。java.time提供所需的类、DayOfWeek枚举和LocalTime类。

事实上,我是如此现代,以至于我正在使用Java 9 中引入toXxxPart的类的方法。如果您尚未使用 Java 9,则需要先从持续时间中减去天数以获取小时数:使用方法。然后用类似的方法得到分钟。DurationDurationminusDaysminusHours

    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;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接

于 2018-04-08T20:04:17.683 回答
0

以另一种方式阅读您的问题,如果t1是开始日期并且t2是结束日期,您的逻辑不包括t1 < t2并且t2 - t1< 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;
}
于 2018-04-08T17:01:33.883 回答