Android Calendar All Day event dates are off by one day for GMT +x Areas

前端 未结 3 576
小蘑菇
小蘑菇 2020-12-28 18:25

I wrote a simple code to insert an all day event into the calendar, using the tutorial from the official site. http://developer.android.com/guide/topics/providers/calendar-p

相关标签:
3条回答
  • 2020-12-28 19:05

    If my event was an all day event, I converted it to local time. This made the all day event stay on the correct date. If it is not all day I left it as normal. I don't think this is a great solution, but it works and if anyone sees a problem with it then let me know.

            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);
    
    0 讨论(0)
  • 2020-12-28 19:10

    A couple ideas:

    1. time zone "independence" of all-day events (treated as if having GMT) [1] [2]
    2. international date line

    [1]"If allDay is set to 1 eventTimezone must be TIMEZONE_UTC and the time must correspond to a midnight boundary."

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

    0 讨论(0)
  • 2020-12-28 19:23

    The docs for CalendarContract.EventsColumns state "If allDay is set to 1 eventTimezone must be TIMEZONE_UTC and the time must correspond to a midnight boundary."

    My solution to ensure that expected dates would be returned after querying the API was to a)Set the start and end event values with dates aligned to UTC. b)Adjust the time returned after querying to take the device timezone and DST into account.

    a)

    @Before
    public void setup(){
        ...
        mJavaCalendar = Calendar.getInstance();
        mInputStart = getUtcDate(
                mJavaCalendar.get(Calendar.YEAR),
                mJavaCalendar.get(Calendar.MONTH),
                mJavaCalendar.get(Calendar.DAY_OF_MONTH));
    }
    
    private long getUtcDate(int year, int month, int day){
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        calendar.set(year, month, day,0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTimeInMillis();
    }
    
    @Test
    public void jCalAlldayTzDflt0000To2400(){
        mTodayEvent.setEventStart(mInputStart);
        mTodayEvent.setEventEnd(mTodayEvent.getEventStart() +  DateUtils.DAY_IN_MILLIS);
        mTodayEvent.setAllDay(true);
        ...
    }
    

    b)

    public static long getTzAdjustedDate(long date){
        TimeZone tzDefault = TimeZone.getDefault();
        return date - tzDefault.getOffset(date);
    }
    
    public void getCorrectDate(cursor){
        isAllDay() == 1 ? DateTimeUtils.getTzAdjustedDate(cursor.getLong(INST_PROJECTION_BEGIN_INDEX)) :
                cursor.getLong(INST_PROJECTION_BEGIN_INDEX));
    

    I hope this helps.

    0 讨论(0)
提交回复
热议问题