From c01f8017e3494b11abadd8bc365a439f7cfe370b Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 4 Jun 2015 17:11:16 +0200 Subject: [PATCH] Fix invalid VTIMEZONE definitions for offsets negative to UTC Resolves T428 --- plugins/libcalendaring/libvcalendar.php | 4 ++-- plugins/libcalendaring/tests/libvcalendar.php | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php index 38441e00..a8aec2dd 100644 --- a/plugins/libcalendaring/libvcalendar.php +++ b/plugins/libcalendaring/libvcalendar.php @@ -1303,8 +1303,8 @@ class libvcalendar implements Iterator $offset = $trans['offset'] / 3600; $cmp->DTSTART = $dt->format('Ymd\THis'); - $cmp->TZOFFSETFROM = sprintf('%s%02d%02d', $tzfrom >= 0 ? '+' : '', floor($tzfrom), ($tzfrom - floor($tzfrom)) * 60); - $cmp->TZOFFSETTO = sprintf('%s%02d%02d', $offset >= 0 ? '+' : '', floor($offset), ($offset - floor($offset)) * 60); + $cmp->TZOFFSETFROM = sprintf('%+03d%02d', floor($tzfrom), ($tzfrom - floor($tzfrom)) * 60); + $cmp->TZOFFSETTO = sprintf('%+03d%02d', floor($offset), ($offset - floor($offset)) * 60); if (!empty($trans['abbr'])) { $cmp->TZNAME = $trans['abbr']; diff --git a/plugins/libcalendaring/tests/libvcalendar.php b/plugins/libcalendaring/tests/libvcalendar.php index 24a646f0..4a105e0d 100644 --- a/plugins/libcalendaring/tests/libvcalendar.php +++ b/plugins/libcalendaring/tests/libvcalendar.php @@ -376,7 +376,7 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase $event['attachments'][0]['id'] = '1'; $event['description'] = '*Exported by libvcalendar*'; - $event['start']->setTimezone(new DateTimezone('Europe/Berlin')); + $event['start']->setTimezone(new DateTimezone('America/Montreal')); $event['end']->setTimezone(new DateTimezone('Europe/Berlin')); $ics = $ical->export(array($event), 'REQUEST', false, array($this, 'get_attachment_data'), true); @@ -387,6 +387,8 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase $this->assertContains('TZID:Europe/Berlin', $ics, "Timezone ID"); $this->assertContains('TZOFFSETFROM:+0100', $ics, "Timzone transition FROM"); $this->assertContains('TZOFFSETTO:+0200', $ics, "Timzone transition TO"); + $this->assertContains('TZOFFSETFROM:-0400', $ics, "TZOFFSETFROM with negative offset (Bug T428)"); + $this->assertContains('TZOFFSETTO:-0500', $ics, "TZOFFSETTO with negative offset (Bug T428)"); $this->assertContains('END:VTIMEZONE', $ics, "VTIMEZONE encapsulation END"); $this->assertContains('BEGIN:VEVENT', $ics, "VEVENT encapsulation BEGIN");