diff --git a/lib/classes/date.php b/lib/classes/date.php index 3685809eb4f..a2b4a6b9361 100644 --- a/lib/classes/date.php +++ b/lib/classes/date.php @@ -72,8 +72,12 @@ class core_date { if (is_numeric($currentvalue)) { // UTC offset. - $modifier = ($currentvalue > 0) ? '+' : ''; - $a = 'UTC' . $modifier . number_format($currentvalue, 1); + if ($currentvalue == 0) { + $a = 'UTC'; + } else { + $modifier = ($currentvalue > 0) ? '+' : ''; + $a = 'UTC' . $modifier . number_format($currentvalue, 1); + } $timezones[$currentvalue] = get_string('timezoneinvalid', 'core_admin', $a); } else { // Some string we don't recognise. @@ -508,7 +512,7 @@ class core_date { ); // Legacy GMT fallback. - for ($i = -14; $i <= 13; $i++) { + for ($i = -12; $i <= 14; $i++) { $off = abs($i); if ($i < 0) { $mapto = 'Etc/GMT+' . $off; diff --git a/lib/tests/date_test.php b/lib/tests/date_test.php index 3e4d908787e..2cd0d9f7329 100644 --- a/lib/tests/date_test.php +++ b/lib/tests/date_test.php @@ -77,7 +77,7 @@ class core_date_testcase extends advanced_testcase { $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14)); $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12)); $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13)); - $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(14)); + $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14)); $this->assertSame('Asia/Kabul', core_date::normalise_timezone(4.5)); $this->assertSame('Asia/Kolkata', core_date::normalise_timezone(5.5)); @@ -107,7 +107,7 @@ class core_date_testcase extends advanced_testcase { $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14)); $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12)); $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13)); - $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(14)); + $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14)); $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland'); $tz = new DateTimeZone('Pacific/Auckland'); @@ -334,6 +334,76 @@ class core_date_testcase extends advanced_testcase { $this->assertSame('Etc/GMT-1', date_default_timezone_get()); } + public function legacyUserTimezoneProvider() { + return [ + ['', 'Australia/Perth'], // Fallback on default timezone. + ['-13.0', 'Australia/Perth'], // Fallback on default timezone. + ['-12.5', 'Etc/GMT+12'], + ['-12.0', 'Etc/GMT+12'], + ['-11.5', 'Etc/GMT+11'], + ['-11.0', 'Etc/GMT+11'], + ['-10.5', 'Etc/GMT+10'], + ['-10.0', 'Etc/GMT+10'], + ['-9.5', 'Etc/GMT+9'], + ['-9.0', 'Etc/GMT+9'], + ['-8.5', 'Etc/GMT+8'], + ['-8.0', 'Etc/GMT+8'], + ['-7.5', 'Etc/GMT+7'], + ['-7.0', 'Etc/GMT+7'], + ['-6.5', 'Etc/GMT+6'], + ['-6.0', 'Etc/GMT+6'], + ['-5.5', 'Etc/GMT+5'], + ['-5.0', 'Etc/GMT+5'], + ['-4.5', 'Etc/GMT+4'], + ['-4.0', 'Etc/GMT+4'], + ['-3.5', 'Etc/GMT+3'], + ['-3.0', 'Etc/GMT+3'], + ['-2.5', 'Etc/GMT+2'], + ['-2.0', 'Etc/GMT+2'], + ['-1.5', 'Etc/GMT+1'], + ['-1.0', 'Etc/GMT+1'], + ['-0.5', 'Etc/GMT'], + ['0', 'Etc/GMT'], + ['0.0', 'Etc/GMT'], + ['0.5', 'Etc/GMT'], + ['1.0', 'Etc/GMT-1'], + ['1.5', 'Etc/GMT-1'], + ['2.0', 'Etc/GMT-2'], + ['2.5', 'Etc/GMT-2'], + ['3.0', 'Etc/GMT-3'], + ['3.5', 'Etc/GMT-3'], + ['4.0', 'Etc/GMT-4'], + ['4.5', 'Asia/Kabul'], + ['5.0', 'Etc/GMT-5'], + ['5.5', 'Asia/Kolkata'], + ['6.0', 'Etc/GMT-6'], + ['6.5', 'Asia/Rangoon'], + ['7.0', 'Etc/GMT-7'], + ['7.5', 'Etc/GMT-7'], + ['8.0', 'Etc/GMT-8'], + ['8.5', 'Etc/GMT-8'], + ['9.0', 'Etc/GMT-9'], + ['9.5', 'Australia/Darwin'], + ['10.0', 'Etc/GMT-10'], + ['10.5', 'Etc/GMT-10'], + ['11.0', 'Etc/GMT-11'], + ['11.5', 'Etc/GMT-11'], + ['12.0', 'Etc/GMT-12'], + ['12.5', 'Etc/GMT-12'], + ['13.0', 'Etc/GMT-13'], + ]; + } + + /** + * @dataProvider legacyUserTimezoneProvider + * @param string $tz The legacy timezone. + * @param string $expected The expected converted timezone. + */ + public function test_get_legacy_user_timezone($tz, $expected) { + $this->setTimezone('Australia/Perth', 'Australia/Perth'); + $this->assertEquals($expected, core_date::get_user_timezone($tz)); + } + public function test_get_user_timezone() { global $CFG, $USER; $this->resetAfterTest(); diff --git a/lib/tests/moodlelib_test.php b/lib/tests/moodlelib_test.php index 229e918186b..f74df9382db 100644 --- a/lib/tests/moodlelib_test.php +++ b/lib/tests/moodlelib_test.php @@ -1582,7 +1582,7 @@ class core_moodlelib_testcase extends advanced_testcase { 'expectedoutput' => '1309485600' ), array( - 'usertimezone' => '14', // Server time. + 'usertimezone' => '-14', // Server time. 'year' => '2011', 'month' => '7', 'day' => '1',