«Год 2038 _проблема» в API календаря Google (приложение для 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 работает отлично, и миллисекунды, которые я получаю, в порядке, но когда я отправляю значения в функцию insert API Google, я думаю, что он не знает, как с этим бороться, а затем вставляет событие в неправильную дату (Год 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

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

1.) Check MyEvent getTime () не возвращает int

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

3.) проверьте, нет ли других тэгов.

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