Я создаю приложение для 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
long
. - person StenSoft   schedule 17.06.2015Google Calendar API
? - person Phantômaxx   schedule 17.06.2015