Для повторных событий я хочу показать количество дней, оставшихся до следующего события в приложении для Android-календаря.-1469913 осталось дней при расчете повторяющихся событий в 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 лет назад? Я не могу объяснить это поведение.
Надеюсь, вы можете мне помочь. Огромное спасибо заранее!
Edit: Как это может быть полезно: год неверных дат всегда выводятся как 1
при использовании DateFormat.getDateInstance().format()
, например, Jan 3, 1
. Тем не менее, результат getDaysLeft()
составляет примерно 4 тыс. Лет.
Редактировать # 2: Я выяснил, что дата, как 1--22199-1
, является той, которая производит выход «4k years left». Тем не менее, он успешно анализируется (new SimpleDateFormat("yyyy-MM-dd")).parse()
. Аналогично, -1-1-1-91-
правильно разобран как Jan 1, 2
.
Редактировать # 3: Оказалось, что такая простая дата, как «0000-01-03», вызвала все проблемы. Когда я вывожу время в миллисекундах, он говорит -62167222800000
. Когда я потом вывожу его в строку GMT, он говорит 0001-01-03
- странно, не так ли? И когда я установил год 1900
, время в миллисе внезапно -122095040400000
. Зачем?
Используйте Joda время API. – adatapost
Джода прикомандирован - но разве это было бы довольно легко отлаживать? –
Почему Джода? Класс «Календарь» на самом деле довольно полезен и прост в обращении, не так ли? Но это непросто отлаживать для меня, поскольку у меня нет этих входных данных для тестирования. Но это может быть только недопустимая дата, поскольку повторяющиеся события всегда будут 366 дней в будущем или меньше, или я бегу против базовой математики? – caw