定期的なイベントについて、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
が、すべての部分で null チェックが行われているため、表示されるか、このようなものになりますよね?
-1469913
-4027
何年も前のようなものを意味します!これは繰り返し発生するイベントであるため、「残り日数」の情報は常に 0 から 366 の間である必要があると考えました。このコードがこのような数値を生成する原因は何ですか? これはgetNextOccurrence()
、4027 年前のデータを返すということですか? この振る舞いを説明することはできません。
あなたが私を助けてくれることを願っています。よろしくお願いします!
編集:参考になるかもしれません: 間違った日付の年が常に出力され1
ます。それにもかかわらず、の結果は4k年のようなものです。DateFormat.getDateInstance().format()
Jan 3, 1
getDaysLeft()
編集#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
. なんで?