android - porque - que es el efecto 2038
"Año 2038_problema" en Google Calendar API(aplicación de Android) (1)
No puedo ayudarte por completo sin todo tu código, pero antes me encontré con un problema similar. Verificaría que no estás transfiriendo nada a una int a lo largo de tu canal de datos.
1.) Compruebe MyEvent getTime () no devuelve un int
2.) comprobar que MyEvent SetTime no lo establece como un int
3.) comprobar que no haya otros int casts.
Si está lanzando a int, Implict o Explict, entonces java convertirá su número en la representación negativa de su número.
Estoy construyendo una aplicación de Android y la aplicación permite al usuario insertar eventos en Google Calendar y en el calendario externo (como la cuenta de Exchange).
El problema es que si el usuario desea agregar un evento después de 2038, crea el evento en el pasado (por ejemplo, enero de 2038 pasa a ser diciembre de 1901 y el 4 de julio de 2038 se convierte en 28 de mayo de 1902). Investigué un poco y me di cuenta de que el problema es " Problema del año 2038 ".
El problema del año 2038 es un problema para las situaciones de computación y almacenamiento de datos en las que los valores de tiempo se almacenan o calculan como un entero de 32 bits con signo, y este número se interpreta como el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970 Tales implementaciones no pueden codificar los tiempos posteriores a las 03:14:07 UTC del 19 de enero de 2038.
La última vez que se puede representar en formato de tiempo entero de 32 bits firmado por Unix es a las 03:14:07 UTC del martes 19 de enero de 2038 (2,147,483,647 segundos después del 1 de enero de 1970). Los tiempos posteriores se "envolverán" y se almacenarán internamente como un número negativo, que estos sistemas interpretarán como si hubieran ocurrido el 13 de diciembre de 1901 en lugar del 19 de enero de 2038. Esto se debe a un desbordamiento de enteros.
Parece que mi código Java funciona bien y los milisegundos que obtengo son correctos, pero cuando envío los valores a la API de Google, insert
función, creo que no sabe cómo manejarla y luego inserta el evento en la fecha incorrecta. (año 1901 y superior). ¿Hay alguna forma de manejarlo?
Este es mi código:
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
}
Esta es la documentación de Google sobre cómo insertar un evento: http://developer.android.com/guide/topics/providers/calendar-provider.html#add-event