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
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);
A couple ideas:
[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
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.