Calendario de Android Las fechas de los eventos de todo el día están desactivadas en un día para GMT + x Áreas

Escribí un código simple para insertar un evento de todo el día en el calendario, usando el tutorial del sitio oficial. Http://developer.android.com/guide/topics/providers/calendar-provider.html

ContentResolver cr = context.getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.DTSTART, dueDate.getTime()); values.put(Events.ALL_DAY, true); values.put(Events.DTEND, dueDate.getTime()); values.put(Events.TITLE, "Some Event"); values.put(Events.CALENDAR_ID, mCalID); TimeZone tz = TimeZone.getDefault(); values.put(Events.EVENT_TIMEZONE, tz.getID()); Uri uri = cr.insert(Events.CONTENT_URI, values); 

Descubrí que cuando abrí la aplicación Google Calendar en el dispositivo Mi Acer que ejecutaba 4.03, la fecha introducida se había desplazado un día. Mi hora local es Sydney, que es GMT + 10.

Así que fui a la configuración cambió la zona horaria local a American Eastern (GMT -5) y corrió el mismo código y no hubo cambio en las fechas. Luego cambié la zona horaria a GMT + 2, Estambul y hubo un cambio en las fechas. Luego cambié a Londres GMT 0, y no hubo cambio.

Cuando hice no todos los eventos del día los tiempos correctos se introdujeron en el calendario, independientemente de la zona horaria.

El informe de error más cercano que encontré fue http://code.google.com/p/android/issues/detail?id=14051

¿Estoy perdiendo algo en el código, o también he encontrado a otros.

Editar En una inspección adicional cuando se leen datos de eventos con resolución de contenido

  ContentResolver cr = context.getContentResolver(); Uri uri = CalendarContract.Events.CONTENT_URI; String selection =CalendarContract.Events._ID + "=?"; String [] selectionArgs = new String[]{String.valueOf(eventID)}; 

El valor del largo cuando se convertía a fecha era la fecha y hora correctas, por ejemplo. 14 de febrero de 2013 12.00 AEST (Sydney Time). Así que el problema debe estar en la forma en que Google Calendar está leyendo en estos valores. Cuando agregué un evento de todo el día manualmente desde la aplicación Calendario en Android, y la hora de leer la resolución de contenido fue la fecha y 11:00 am en AEST (Sydney Time), lo que corresponde a la diferencia de +11 GMT en Sydney. Por lo tanto, todos los eventos del día tienen que ser ingresados ​​en GMT para evitar esto, pero no hay mención de esto en la documentación.

Así que ahora estoy cambiando el tiempo, para evitar este problema.

Un par de ideas:

  1. Zona horaria "independencia" de los eventos de todo el día (tratados como si tuvieran GMT) [1] [2]
  2. línea internacional del tiempo

[1] "Si allDay se establece en 1 eventTimezone debe ser TIMEZONE_UTC y el tiempo debe corresponder a un límite de medianoche."

[2] http://developer.android.com/reference/android/provider/CalendarContract.Events.html

Si mi evento fue un evento de todo el día, lo convertí a hora local. Esto hizo que el evento todo el día estancia en la fecha correcta. Si no es todo el día lo dejé como de costumbre. No creo que esta es una gran solución, pero funciona y si alguien ve un problema con ella, entonces hágamelo saber.

  var startDate = yourCalendarEvent.StartDate; if (yourCalendarEvent.IsAllDay) { startDate = startDate.ToLocalTime(); } Java.Util.GregorianCalendar calStartDate = new Java.Util.GregorianCalendar(startDate.Year, startDate.Month - 1, startDate.Day, startDate.Hour, startDate.Minute, startDate.Second); intent.PutExtra(CalendarContract.ExtraEventBeginTime, calStartDate.TimeInMillis); 
  • Java.lang.NoClassDefFoundError en el estudio android
  • Calendario de Android: cómo escribir el adaptador de sincronización para el calendario INSERT
  • Cómo adjuntar datos privados al evento de calendario android
  • Los eventos AllDay de Android comienzan o terminan en el día incorrecto
  • Android Formato de fecha con zona horaria
  • Crear evento de calendario desde mi aplicación sin recordatorios predeterminados
  • API de Google: ¿Diferencia entre la clave del navegador y la clave de Android?
  • Evento de calendario guardado localmente en el teléfono, pero no se puede sincronizar con Google Calendar.
  • Esquema de URL para activar el cliente del calendario
  • Obtenga los horarios de inicio y fin de Google Calendar Events con google-java-api-client en Android
  • Cómo desarrollar una aplicación para Android que utilice Google Calendar API
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.