2038 год _проблема в Google Calendar API (приложение для Android)

Я создаю приложение для Android, и приложение позволяет пользователю вставлять события в календарь Google и внешний календарь (например, учетную запись Exchange).

Проблема в том, что если пользователь хочет добавить событие после 2038 года, он создает событие в прошлом (например, январь 2038 года становится декабрем 1901 года, а 4 июля 2038 года становится 28 мая 1902 года). Я провел небольшое исследование и понял, что проблема заключается в "проблеме 2038 года".

Проблема 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


person TamarG    schedule 16.06.2015    source источник
comment
Что именно происходит?   -  person SLaks    schedule 17.06.2015
comment
Ждать, пока спецификация обновится и использовать 64-битное целое число? 2038 год не совсем актуален для приложений календаря пока.   -  person Patrick Roberts    schedule 17.06.2015
comment
@SLaks - время после января 2038 года хранится внутри как отрицательное число, что создает событие в декабре 1901 года, а не в январе 2038 года.   -  person TamarG    schedule 17.06.2015
comment
В Java нет проблем с 2038 годом, как и в CalendarContract Так что проблема скорее всего в конкретном бэкенде. @PatrickRoberts Java хранит время в миллисекундах в 64-битном формате long.   -  person StenSoft    schedule 17.06.2015
comment
Вы имеете ввиду в коде? При отладке все выглядит нормально, только функция Insert вставляет неправильную дату   -  person TamarG    schedule 17.06.2015
comment
Ну... кто заставляет вас использовать Google Calendar API?   -  person Phantômaxx    schedule 17.06.2015
comment
Есть ли другой вариант вставки событий в календари Google/внешние календари с помощью приложения Android?   -  person TamarG    schedule 17.06.2015
comment
Вы не можете использовать базу данных? Вот отличный пример: codeyourenthusiasm.wordpress.com/category/android.   -  person Phantômaxx    schedule 17.06.2015
comment
База данных не поможет моей цели.   -  person TamarG    schedule 17.06.2015
comment
Шестнадцатеричный›64-битный›32-битный Google необходимо обновить свои материалы   -  person Justin De La Fosse    schedule 26.03.2019


Ответы (1)


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

1.) Убедитесь, что MyEvent getTime() не возвращает int

2.) убедитесь, что MyEvent SetTime не устанавливает его как int

3.) проверьте, что других типов int не существует.

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

person nbroeking    schedule 17.06.2015
comment
getTime() возвращает правильное (положительное) число. На самом деле - в режиме отладки я вижу, что все значения в порядке за мгновение до того, как я отправлю их в функцию вставки, а функция вставки не моя... - person TamarG; 17.06.2015