diff --git a/lib/kolab_sync_timezone_converter.php b/lib/kolab_sync_timezone_converter.php old mode 100644 new mode 100755 --- a/lib/kolab_sync_timezone_converter.php +++ b/lib/kolab_sync_timezone_converter.php @@ -393,6 +393,15 @@ $timezoneInfo = unpack($timezoneUnpackString, base64_decode($_packedTimezoneInfo)); + if ($timezoneInfo['standardHour'] == 23 && $timezoneInfo['standardMilliseconds'] == 999 + && $timezoneInfo['standardMinute'] == 59 && $timezoneInfo['standardSecond'] == 59 + ) { + $timezoneInfo['standardHour'] = 24; + $timezoneInfo['standardMinute'] = 0; + $timezoneInfo['standardSecond'] = 0; + $timezoneInfo['standardMilliseconds'] = 0; + } + return $timezoneInfo; } @@ -408,6 +417,16 @@ return null; } + // According to e.g. https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime, + // 24 is not allowed in the Hour field, and consequently Outlook can't deal with it. + // This is the same workaround that Outlook applies. + if ($_timezoneInfo['standardHour'] == 24) { + $_timezoneInfo['standardHour'] = 23; + $_timezoneInfo['standardMinute'] = 59; + $_timezoneInfo['standardSecond'] = 59; + $_timezoneInfo['standardMilliseconds'] = 999; + } + $packed = pack( "la64vvvvvvvvla64vvvvvvvvl", $_timezoneInfo['bias'], diff --git a/tests/timezone_converter.php b/tests/timezone_converter.php old mode 100644 new mode 100755 --- a/tests/timezone_converter.php +++ b/tests/timezone_converter.php @@ -103,6 +103,18 @@ $this->assertSame($output['daylightMonth'], 3); $this->assertSame($output['daylightDay'], 5); $this->assertSame($output['daylightHour'], 0); + + $output = $converter->getOffsetsForTimezone('Asia/Tehran', $datetime); + + $this->assertSame($output['bias'], -210); + $this->assertSame($output['standardBias'], 0); + $this->assertSame($output['standardMonth'], 9); + $this->assertSame($output['standardDay'], 3); + $this->assertSame($output['standardHour'], 24); + $this->assertSame($output['daylightBias'], -60); + $this->assertSame($output['daylightMonth'], 3); + $this->assertSame($output['daylightDay'], 4); + $this->assertSame($output['daylightHour'], 0); } }