Buduję aplikację dla systemu Android, a aplikacja umożliwia wstawianie zdarzeń do Kalendarza Google i kalendarza zewnętrznego (np. Konto Exchange)."Rok 2038 _problem" w Google Calendar API (aplikacja na Androida)
Problem polega na tym, że jeśli użytkownik chce dodać wydarzenie po 2038, tworzy zdarzenie w przeszłości (na przykład - styczeń 2038 staje się grudzień 1901, a 4 lipca 2038 staje się 28 maja 1902). Zrobiłem trochę badań i uznałem, że problemem jest "Year 2038 problem".
Problem Rok 2038 jest to problem dla obliczeniowych i przechowywania danych sytuacjach, w których wartości czasowe są przechowywane lub obliczonych jako podpisanego 32-bitowej liczby całkowitej, a liczba ta jest interpretowana jako liczba sekund od 00 : 00: 00 UTC na 1 stycznia 1970. Takie wdrożeń nie może kodować razy po 03:14:07 UTC w dniu 19 stycznia 2038.
najnowszy czasu, który może być przedstawiony w podpisanym 32-bitowej liczby całkowitej czasu Unix w formacie jest 03:14:07 UTC we wtorek, 19 stycznia 2038 r. (2 147 483 647 sekund po 1 stycznia 1970 r.). Czasy przekraczające ten czas "zawijają się" i będą przechowywane wewnętrznie jako liczba ujemna, które te systemy będą interpretować jako te, które wystąpiły 13 grudnia 1901 r. Zamiast 19 stycznia 2038 r. Jest to spowodowane przepełnieniem liczby całkowitej.
Wydaje się, że mój kod Java działa dobrze i milisekundy dostaję są OK, ale kiedy wysłać wartości do Google API insert
funkcji - I myśli, że nie wie, jak sobie z tym poradzić, a następnie wstawia wydarzenie w niewłaściwym dniu (rok 1901 i wyżej). Czy istnieje sposób, aby sobie z tym poradzić?
To jest mój kod:
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
}
To dokumentacji Google o wstawienie zdarzenia: http://developer.android.com/guide/topics/providers/calendar-provider.html#add-event
Co dokładnie dzieje się? – SLaks
Czekać na aktualizację specyfikacji i używać 64-bitowej liczby całkowitej? Rok 2038 nie jest dokładnie odpowiedni w aplikacjach kalendarza * jeszcze *. –
@SLaks - czasy poza styczniem 2038 są przechowywane wewnętrznie jako liczba ujemna, która tworzy wydarzenie w grudniu 1901 r., A nie w styczniu 2038 r. – TamarG