对于重复发生的事件,我想在我的 Android 日历应用程序中显示下一次发生的剩余天数。
例子:
Today: 2012-06-12
Reoccurring event: 19th June
=> 13 days left
为了实现这一点,我将第一次出现保存在数据类型的对象中Calendar
:
private Calendar cal;
...
cal = new GregorianCalendar();
cal.set(Calendar.YEAR, USER_INPUT_YEAR);
cal.set(Calendar.MONTH, USER_INPUT_MONTH);
...
为了计算剩下的天数,我使用这个函数:
public int getDaysLeft() {
Date next = this.getNextOccurrence();
if (next == null) {
return -1;
}
else {
long differenceInMilliseconds = next.getTime()-System.currentTimeMillis();
double differenceInDays = (double) differenceInMilliseconds/DateUtils.DAY_IN_MILLIS;
return (int) Math.ceil(differenceInDays);
}
}
哪个使用此功能:
public Date getNextOccurrence() {
if (this.cal == null) {
return null;
}
else {
Calendar today = new GregorianCalendar();
Calendar next = new GregorianCalendar();
next.setTime(this.cal.getTime());
next.set(Calendar.YEAR, today.get(Calendar.YEAR));
if ((today.get(Calendar.MONTH) > this.cal.get(Calendar.MONTH)) || ((today.get(Calendar.MONTH) == this.cal.get(Calendar.MONTH)) && (today.get(Calendar.DAY_OF_MONTH) > this.cal.get(Calendar.DAY_OF_MONTH)))) {
next.add(Calendar.YEAR, 1);
}
return next.getTime();
}
}
顺便说一句,要获得初始日期,我希望找到一个 YYYY-MM-DD 值并像这样解析它:
(new SimpleDateFormat("yyyy-MM-dd")).parse(INPUT_DATE_STRING)
这在大多数情况下都可以正常工作,但一些用户报告说他们看到了诸如-1469913
“剩余天数”之类的数字。这怎么可能发生?
我认为日期 ( cal
) 可能未设置或无效,但随后它会显示-1
或类似的东西,因为所有部分都有空检查,对吗?
-1469913
-4027
意味着几年前的东西!由于这是一个重复发生的事件,我认为“剩余天数”信息应始终在 0 到 366 之间。什么可能导致此代码产生这样的数字?这是否意味着getNextOccurrence()
返回一个 4027 年前的数据?我无法解释这种行为。
我希望你能帮助我。非常感谢您!
编辑:因为它可能会有所帮助:错误日期的年份总是1
在使用时输出DateFormat.getDateInstance().format()
,例如Jan 3, 1
。然而,结果getDaysLeft()
是大约 4k 年。
编辑#2:我发现一个日期1--22199-1
,比如产生“还剩 4k 年”的输出。尽管如此,它还是被成功解析了(new SimpleDateFormat("yyyy-MM-dd")).parse()
。同样,-1-1-1-91-
被正确解析为Jan 1, 2
.
编辑#3:事实证明,像“0000-01-03”这样简单的日期造成了所有麻烦。当我以毫秒为单位输出时间时,它会说-62167222800000
。然后当我将它输出到 GMT 字符串时,它会说0001-01-03
- 很奇怪,不是吗?当我将年份设置为1900
以毫秒为单位的时间时,突然-122095040400000
。为什么?