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.
- Tratando de establecer un huso horario para un evento
- Dependencia apache cliente HTTP en android con API de Google
- No se puede eliminar un recordatorio de Calendar en Android
- ¿Cómo elimino mi propio calendario personalizado corrompido mediante programación?
- Google OAuth2 - token de acceso y token de actualización -> invalid_grant / Code ya se redimió
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.
- Evento de sincronización agregado mediante programación con google calendar en android
- Android google calendar api no funciona cuando en la versión
- Error de autorización de Google Calendar API
- ¿Cómo puedo averiguar el resultado de mi intención de calendario?
- No se pueden insertar varios eventos en Google Calendar.
- Cómo obtener vacaciones nacionales de un país seleccionado
- API de calendario de Android insertar evento recurrente
- ¿Cómo leer los eventos de Google Calendar en android?
Un par de ideas:
- Zona horaria "independencia" de los eventos de todo el día (tratados como si tuvieran GMT) [1] [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);
- Creación de una aplicación Android Instant con componente de aplicación de Dagger
- Cómo utilizar ffmpeg / libavcodec / libstagefright