我有两个日历日期,我可以得到天数,小时数和分钟数之间的差异。
如果结束日期大于开始日期,则此方法非常有效。 如果开始日期与结束日期的星期几相同,但是比结束日期早的时间,则无效的是。 例如:结束日期星期六下午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);
}
答案 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。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();
是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。答案 1 :(得分:0)
以另一种方式阅读您的问题,如果t1
是开始日期且t2
是结束日期,那么您的逻辑不包括t1 < t2
和t2 - 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;
}