Для повторяющихся событий я хочу показать количество дней, оставшихся до следующего события в моем приложении календаря 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();
}
}
Кстати, чтобы получить начальную дату, я ожидаю найти значение ГГГГ-ММ-ДД и проанализировать его следующим образом:
(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()
составляет что-то вроде 4к лет.
Правка № 2: я обнаружил, что такая дата, как 1--22199-1
, выдает "осталось 4 000 лет". Тем не менее, он успешно разбирается (new SimpleDateFormat("yyyy-MM-dd")).parse()
. Точно так же -1-1-1-91-
правильно интерпретируется как Jan 1, 2
.
Правка №3: оказалось, что такая простая дата, как "0000-01-03", вызывала все проблемы. Когда я вывожу время в миллисекундах, он говорит -62167222800000
. Когда я затем вывожу его в строку по Гринвичу, он говорит 0001-01-03
- странно, не так ли? И когда я установил год на 1900
, время в миллисекундах внезапно стало -122095040400000
. Почему?
Calendar
на самом деле весьма полезен и прост в обращении, не так ли? Но мне это нелегко отладить, так как у меня нет входных данных для тестирования. Но это может быть только неверная дата, поскольку повторяющиеся события всегда происходят через 366 дней или меньше, или я нарушаю базовую математику? - person caw   schedule 12.06.2012Calendar
. - person caw   schedule 15.06.2012