diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index f88ecb3f..2f9dd4bb 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -331,15 +331,17 @@ class database_driver extends calendar_driver // use start date from master but try to be smart on time or duration changes $old_start_date = date('Y-m-d', $old['start']); - $old_start_time = date('H:i:s', $old['start']); + $old_start_time = date('H:i', $old['start']); $old_duration = $old['end'] - $old['start']; $new_start_date = date('Y-m-d', $event['start']); - $new_start_time = date('H:i:s', $event['start']); + $new_start_time = date('H:i', $event['start']); $new_duration = $event['end'] - $event['start']; + $diff = $old_start_date != $new_start_date || $old_start_time != $new_start_time || $old_duration != $new_duration; + // shifted or resized - if ($old_start_date == $new_start_date || $old_duration == $new_duration) { + if ($diff && $event['id'] != $master['id'] && ($old_start_date == $new_start_date || $old_duration == $new_duration)) { $event['start'] = $master['start'] + ($event['start'] - $old['start']); $event['end'] = $event['start'] + $new_duration; } diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 3f779bce..a4a88cd8 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -447,10 +447,15 @@ class kolab_calendar $events = array(); $duration = $event['end'] - $event['start']; - $next = new Horde_Date($event['start']); + $tz_offset = $event['allday'] ? $this->cal->timezone * 3600 - date('Z') : 0; + $next = new Horde_Date($event['start'] + $tz_offset); # shift all-day times to server timezone because computation operates in local TZ $i = 0; while ($next = $recurrence->nextActiveRecurrence(array('year' => $next->year, 'month' => $next->month, 'mday' => $next->mday + 1, 'hour' => $next->hour, 'min' => $next->min, 'sec' => $next->sec))) { - $rec_start = $next->timestamp(); + if ($event['allday']) { + $next->hour = $hour; # fix time for all-day events + $next->min = 0; + } + $rec_start = $next->timestamp() - $tz_offset; $rec_end = $rec_start + $duration; $rec_id = $event['id'] . '-' . ++$i; diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index 3e41426a..3d60f826 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -660,15 +660,17 @@ class kolab_driver extends calendar_driver // use start date from master but try to be smart on time or duration changes $old_start_date = date('Y-m-d', $old['start']); - $old_start_time = date('H:i:s', $old['start']); + $old_start_time = date('H:i', $old['start']); $old_duration = $old['end'] - $old['start']; $new_start_date = date('Y-m-d', $event['start']); - $new_start_time = date('H:i:s', $event['start']); + $new_start_time = date('H:i', $event['start']); $new_duration = $event['end'] - $event['start']; + $diff = $old_start_date != $new_start_date || $old_start_time != $new_start_time || $old_duration != $new_duration; + // shifted or resized - if ($old_start_date == $new_start_date || $old_duration == $new_duration) { + if ($diff && $event['id'] != $master['id'] && ($old_start_date == $new_start_date || $old_duration == $new_duration)) { $event['start'] = $master['start'] + ($event['start'] - $old['start']); $event['end'] = $event['start'] + $new_duration;