2015-06-16 3 views
7

Я создаю приложение для 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

+0

Что именно происходит? – SLaks

+0

Подождите, пока спецификация обновит и использует 64-разрядное целое число? 2038 год не подходит для календарных приложений * еще *. –

+0

@SLaks - Times за январь 2038 года хранится внутри как отрицательное число, которое создает событие в декабре 1901 года, а не в январе 2038 года. – TamarG

ответ

1

Я не могу в полной мере помочь не весь код, но я столкнулся с подобным вопросом до. Я бы проверял, что вы не производите что-либо в int по конвейеру данных.

1.) Проверьте MyEvent GetTime() оленья кожа возвращать ИНТ

2.) проверьте, что MyEvent SetTime не устанавливает его как INT

3.) проверить не существует никаких других ИНТ забросы.

Если вы выполняете команду int, Implict или Explict, то java превратит ваш номер в отрицательное представление вашего номера.

+0

getTime() возвращает правильный (положительный) номер. Фактически - в режиме отладки я вижу, что все значения в порядке, прежде чем я отправлю их в функцию «вставить», а функция вставки не моя ... – TamarG

Смежные вопросы