Подтвердить что ты не робот

Календарь Android Календарь всех дней праздника отключается на один день для GMT + x Области

Я написал простой код, чтобы вставить событие в течение всего дня в календарь, используя учебник с официального сайта. 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);

Я обнаружил, что когда я открыл приложение Календаря Google на моем устройстве Acer с 4.03, введенная дата была перенесена на 1 день. Мой локальный часовой пояс - Сидней, GMT + 10.

Итак, я пошел в настройки, изменив локальный часовой пояс на американский восток (GMT -5) и запустив тот же код, и не было сдвига в датах. Затем я изменил часовой пояс на GMT + 2, Стамбул, и произошел сдвиг в датах. Затем я перебрался в Лондон в формате GMT ​​0, и сдвиг не изменился.

Когда я делал не весь день, правильные времена были введены в календарь независимо от часового пояса.

Самый близкий отчет об ошибке, который я нашел, это http://code.google.com/p/android/issues/detail?id=14051

Я пропустил что-то в коде, или другие люди тоже столкнулись с этим.

Edit При дальнейшей проверке при чтении данных о событиях с использованием преобразователя содержимого

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

Значение long при конвертировании на дату было правильной датой и временем, например. 14 февраля 2013 г. 12.00 AEST (Сиднейское время). Поэтому проблема должна быть в том, как Google Calendar читает эти значения. Когда я добавил событие всего дня вручную из приложения "Календарь" на Android и прочитал время, используя контент-резольвер, это была дата и 11.00 утра в AEST (Sydney Time), что соответствует +11 GMT, установленному в Сиднее. Поэтому все дневные события необходимо вводить в GMT, чтобы этого избежать, но об этом не упоминается в документации.

Итак, теперь я меняю время, чтобы избежать этой проблемы.

4b9b3361

Ответ 1

Несколько идей:

  • "независимость" часовых поясов от всех дней (рассматривается как имеющее GMT) [1] [2]
  • международная дата-строка

[1] "Если для allDay установлено значение 1 eventTimezone, это TIMEZONE_UTC, и время должно соответствовать полуночной границе."

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

Ответ 2

Если мое событие было событием всего дня, я преобразовал его в локальное время. Это сделало пребывание в течение всего дня в правильную дату. Если это не весь день, я оставил его как обычно. Я не думаю, что это отличное решение, но оно работает, и если кто-то видит проблему с этим, дайте мне знать.

        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);