Я создаю приложение для Android, и приложение позволяет пользователю вставлять события в Календарь Google и внешний календарь (например, учетную запись Exchange).«Год 2038 _проблема» в API календаря Google (приложение для Android)
Проблема в том, что если пользователь хочет добавить событие после 2038 года, он создает событие в прошлом (например, январь 2038 года становится декабрем 1901 года, а 4 июля 2038 года становится 28 мая 1902 года). Я сделал некоторые исследования и понял, что проблема «Year 2038 problem».
Год 2038 проблема является проблемой для вычислений и хранения данных ситуаций, в которых значение времени хранятся или вычисленные в виде подписанного 32-битового целого числа, и это число интерпретируются как число секунд с 00 : 00: 00 UTC на 1 января 1970 года такие реализации не может кодировать раз после 03:14:07 UTC 19 января 2038
последний раз, который может быть представлен в подписанном 32-разрядное целое время Unix в формат является 03:14:07 UTC во вторник, 19 января 2038 года (2 147 483 647 секунд после 1 января 1970 года). Время, превышающее это, будет «обернуть» и будет храниться внутри как отрицательное число, которое эти системы будет интерпретировать как имевшее место 13 декабря 1901 года, а не 19 Январь 2038 года. Это вызвано переполнением целых чисел.
кажется, что мой Java-код работает отлично и миллисекунды я получаю в порядке, но когда я посылаю значение Google API insert
функции - Я думает, что не знает, как бороться с ним, а затем он вставляет событие в неправильную дату (1901 год и выше). Есть ли способ справиться с этим?
Это мой код:
private void InsertEvent(MyEvent myEvent) {
Uri EVENTS_URI = Uri.parse(getCalendarUriBase() + "events");
ContentValues eventValues = new ContentValues();
eventValues.put("eventTimezone", TimeZone.getDefault().getID());
eventValues.put("calendar_id", myEvent.calId);
eventValues.put("title",myEvent.title);
eventValues.put("allDay", 1);
long dateStart = myEvent.startDate.getTime(); // returns milliseconds - 2160248400000 for date 06/16/2038
eventValues.put("dtstart", dateStart);
long dateEnd = myEvent.endDate.getTime();
eventValues.put("dtend", dateEnd );
// At this point, in debug mode, I can see that the millisecond of dtstart and dtend are OK.
Uri u1 = contentResolver.insert(EVENTS_URI, eventValues); // API's function
}
Это документация Google о вставке события: http://developer.android.com/guide/topics/providers/calendar-provider.html#add-event
Что именно происходит? – SLaks
Подождите, пока спецификация обновит и использует 64-разрядное целое число? 2038 год не подходит для календарных приложений * еще *. –
@SLaks - Times за январь 2038 года хранится внутри как отрицательное число, которое создает событие в декабре 1901 года, а не в январе 2038 года. – TamarG