2015-06-16 18 views
7

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

+0

Co dokładnie dzieje się? – SLaks

+0

Czekać na aktualizację specyfikacji i używać 64-bitowej liczby całkowitej? Rok 2038 nie jest dokładnie odpowiedni w aplikacjach kalendarza * jeszcze *. –

+0

@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

Odpowiedz

1

nie mogę w pełni pomóc bez wszystkich kodzie ale ja wpadłem na podobnym problemie przed. Sprawdziłbym, czy nie przesyłasz niczego do int wzdłuż potoku danych.

1.) Sprawdź MyEvent getTime() robi powrócić int

2.) sprawdzić, MyEvent SetTime nie ustawia go jako int

3) sprawdzić istnieją żadne inne int odlewy.

Jeśli przenosisz do int, Implict lub Explict, java zmieni Twój numer w negatywną reprezentację Twojego numeru.

+0

getTime() zwraca prawidłowy (dodatni) numer. W rzeczywistości - w trybie debugowania widzę, że wszystkie wartości są OK na chwilę przed wysłaniem ich do funkcji "wstawiania", a funkcja wstawiania nie jest moja ... – TamarG

Powiązane problemy