Merge branch 'MDL-55609-master' of git://github.com/andrewnicols/moodle
[moodle.git] / lib / tests / date_test.php
blob2cd0d9f7329dc6df7fbfc2c6d50a8a626c66e858
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 /**
18 * Tests core_date class.
20 * @package core
21 * @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 * @author Petr Skoda <petr.skoda@totaralms.com>
26 defined('MOODLE_INTERNAL') || die();
28 /**
29 * Tests core_date class.
31 * @package core
32 * @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
33 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34 * @author Petr Skoda <petr.skoda@totaralms.com>
36 class core_date_testcase extends advanced_testcase {
37 public function test_get_default_php_timezone() {
38 $this->resetAfterTest();
40 $origtz = core_date::get_default_php_timezone();
41 $this->assertNotEmpty($origtz);
43 $this->setTimezone('Pacific/Auckland', 'Europe/Prague');
44 $this->assertSame('Europe/Prague', core_date::get_default_php_timezone());
46 $this->setTimezone('Pacific/Auckland', 'UTC');
47 $this->assertSame('UTC', core_date::get_default_php_timezone());
49 $this->setTimezone('Pacific/Auckland', 'GMT');
50 $this->assertSame('GMT', core_date::get_default_php_timezone());
53 public function test_normalise_timezone() {
54 $this->resetAfterTest();
56 $this->setTimezone('Pacific/Auckland');
57 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
58 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
59 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
60 $this->assertSame('GMT', core_date::normalise_timezone('GMT'));
61 $this->assertSame('UTC', core_date::normalise_timezone('UTC'));
62 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
63 $this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
64 $this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
65 $this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
66 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
67 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
68 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
69 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
70 $this->assertSame('Etc/GMT+4', core_date::normalise_timezone(-4));
71 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
72 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
73 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
74 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
75 $this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
76 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
77 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
78 $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
79 $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
80 $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
82 $this->assertSame('Asia/Kabul', core_date::normalise_timezone(4.5));
83 $this->assertSame('Asia/Kolkata', core_date::normalise_timezone(5.5));
84 $this->assertSame('Asia/Rangoon', core_date::normalise_timezone(6.5));
85 $this->assertSame('Australia/Darwin', core_date::normalise_timezone('9.5'));
87 $this->setTimezone('99', 'Pacific/Auckland');
88 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
89 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
90 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
91 $this->assertSame('GMT', core_date::normalise_timezone('GMT'));
92 $this->assertSame('UTC', core_date::normalise_timezone('UTC'));
93 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
94 $this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
95 $this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
96 $this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
97 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
98 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
99 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
100 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
101 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
102 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
103 $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
104 $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
105 $this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
106 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
107 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
108 $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
109 $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
110 $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
112 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
113 $tz = new DateTimeZone('Pacific/Auckland');
114 $this->assertSame('Pacific/Auckland', core_date::normalise_timezone($tz));
117 public function test_windows_conversion() {
118 $file = __DIR__ . '/fixtures/timezonewindows.xml';
120 $contents = file_get_contents($file);
121 preg_match_all('/<mapZone other="([^"]+)" territory="001" type="([^"]+)"\/>/', $contents, $matches, PREG_SET_ORDER);
123 $this->assertCount(104, $matches); // NOTE: If the file contents change edit the core_date class and update this.
125 foreach ($matches as $match) {
126 $result = core_date::normalise_timezone($match[1]);
127 if ($result == $match[2]) {
128 $this->assertSame($match[2], $result);
129 } else {
130 $data = new DateTime('now', new DateTimeZone($match[2]));
131 $expectedoffset = $data->getOffset();
132 $data = new DateTime('now', new DateTimeZone($result));
133 $resultoffset = $data->getOffset();
134 $this->assertSame($expectedoffset, $resultoffset, "$match[1] is expected to be converted to $match[2] not $result");
140 * Sanity test for PHP stuff.
142 public function test_php_gmt_offsets() {
143 $this->resetAfterTest();
145 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
147 for ($i = -12; $i < 0; $i++) {
148 $date = new DateTime('now', new DateTimeZone("Etc/GMT{$i}"));
149 $this->assertSame(- $i * 60 * 60, $date->getOffset());
150 $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT{$i}")));
151 $this->assertSame($i * 60 * 60, $date->getOffset());
152 $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC{$i}")));
153 $this->assertSame($i * 60 * 60, $date->getOffset());
156 $date = new DateTime('now', new DateTimeZone('Etc/GMT'));
157 $this->assertSame(0, $date->getOffset());
159 for ($i = 1; $i <= 12; $i++) {
160 $date = new DateTime('now', new DateTimeZone("Etc/GMT+{$i}"));
161 $this->assertSame(- $i * 60 * 60, $date->getOffset());
162 $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT+{$i}")));
163 $this->assertSame($i * 60 * 60, $date->getOffset());
164 $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC+{$i}")));
165 $this->assertSame($i * 60 * 60, $date->getOffset());
169 public function test_get_localised_timezone() {
170 $this->resetAfterTest();
172 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
174 $result = core_date::get_localised_timezone('Pacific/Auckland');
175 $this->assertSame('Pacific/Auckland', $result);
177 $result = core_date::get_localised_timezone('99');
178 $this->assertSame('Server timezone (Pacific/Auckland)', $result);
180 $result = core_date::get_localised_timezone(99);
181 $this->assertSame('Server timezone (Pacific/Auckland)', $result);
183 $result = core_date::get_localised_timezone('Etc/GMT-1');
184 $this->assertSame('UTC+1', $result);
186 $result = core_date::get_localised_timezone('Etc/GMT+2');
187 $this->assertSame('UTC-2', $result);
189 $result = core_date::get_localised_timezone('GMT');
190 $this->assertSame('UTC', $result);
192 $result = core_date::get_localised_timezone('Etc/GMT');
193 $this->assertSame('UTC', $result);
196 public function test_get_list_of_timezones() {
197 $this->resetAfterTest();
199 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
201 $phpzones = DateTimeZone::listIdentifiers();
203 $zones = core_date::get_list_of_timezones();
204 $this->assertSame(count($phpzones), count($zones));
205 foreach ($zones as $zone => $zonename) {
206 $this->assertSame($zone, $zonename); // The same in English!
207 $this->assertContains($zone, $phpzones); // No extras expected.
210 $this->assertSame($zones, core_date::get_list_of_timezones(null, false));
212 $nnzones = core_date::get_list_of_timezones(null, true);
213 $last = $nnzones['99'];
214 $this->assertSame('Server timezone (Pacific/Auckland)', $last);
215 unset($nnzones['99']);
216 $this->assertSame($zones, $nnzones);
218 $nnzones = core_date::get_list_of_timezones('99', false);
219 $last = $nnzones['99'];
220 $this->assertSame('Server timezone (Pacific/Auckland)', $last);
221 unset($nnzones['99']);
222 $this->assertSame($zones, $nnzones);
224 $xxzones = core_date::get_list_of_timezones('xx', false);
225 $xx = $xxzones['xx'];
226 $this->assertSame('Invalid timezone "xx"', $xx);
227 unset($xxzones['xx']);
228 $this->assertSame($zones, $xxzones);
230 $xxzones = core_date::get_list_of_timezones('1', false);
231 $xx = $xxzones['1'];
232 $this->assertSame('Invalid timezone "UTC+1.0"', $xx);
233 unset($xxzones['1']);
234 $this->assertSame($zones, $xxzones);
236 $xxzones = core_date::get_list_of_timezones('-1.5', false);
237 $xx = $xxzones['-1.5'];
238 $this->assertSame('Invalid timezone "UTC-1.5"', $xx);
239 unset($xxzones['-1.5']);
240 $this->assertSame($zones, $xxzones);
244 public function test_get_server_timezone() {
245 global $CFG;
246 $this->resetAfterTest();
248 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
249 $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
251 $this->setTimezone('Pacific/Auckland', 'Europe/Prague');
252 $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
254 $this->setTimezone('99', 'Pacific/Auckland');
255 $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
257 $this->setTimezone(99, 'Pacific/Auckland');
258 $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
260 $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
261 unset($CFG->timezone);
262 $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
264 // Admin should fix the settings.
265 $this->setTimezone('xxx/zzzz', 'Europe/Prague');
266 $this->assertSame('Europe/Prague', core_date::get_server_timezone());
269 public function test_get_server_timezone_object() {
270 $this->resetAfterTest();
272 $zones = core_date::get_list_of_timezones();
273 foreach ($zones as $zone) {
274 $this->setTimezone($zone, 'Pacific/Auckland');
275 $tz = core_date::get_server_timezone_object();
276 $this->assertInstanceOf('DateTimeZone', $tz);
277 $this->assertSame($zone, $tz->getName());
281 public function test_set_default_server_timezone() {
282 global $CFG;
283 $this->resetAfterTest();
285 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
286 unset($CFG->timezone);
287 date_default_timezone_set('UTC');
288 core_date::set_default_server_timezone();
289 $this->assertSame('Pacific/Auckland', date_default_timezone_get());
291 $this->setTimezone('', 'Pacific/Auckland');
292 date_default_timezone_set('UTC');
293 core_date::set_default_server_timezone();
294 $this->assertSame('Pacific/Auckland', date_default_timezone_get());
296 $this->setTimezone('99', 'Pacific/Auckland');
297 date_default_timezone_set('UTC');
298 core_date::set_default_server_timezone();
299 $this->assertSame('Pacific/Auckland', date_default_timezone_get());
301 $this->setTimezone(99, 'Pacific/Auckland');
302 date_default_timezone_set('UTC');
303 core_date::set_default_server_timezone();
304 $this->assertSame('Pacific/Auckland', date_default_timezone_get());
306 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
307 $CFG->timezone = 'UTC';
308 core_date::set_default_server_timezone();
309 $this->assertSame('UTC', date_default_timezone_get());
311 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
312 $CFG->timezone = 'Australia/Perth';
313 core_date::set_default_server_timezone();
314 $this->assertSame('Australia/Perth', date_default_timezone_get());
316 $this->setTimezone('0', 'Pacific/Auckland');
317 date_default_timezone_set('UTC');
318 core_date::set_default_server_timezone();
319 $this->assertSame('Etc/GMT', date_default_timezone_get());
321 $this->setTimezone('1', 'Pacific/Auckland');
322 date_default_timezone_set('UTC');
323 core_date::set_default_server_timezone();
324 $this->assertSame('Etc/GMT-1', date_default_timezone_get());
326 $this->setTimezone(1, 'Pacific/Auckland');
327 date_default_timezone_set('UTC');
328 core_date::set_default_server_timezone();
329 $this->assertSame('Etc/GMT-1', date_default_timezone_get());
331 $this->setTimezone('1.0', 'Pacific/Auckland');
332 date_default_timezone_set('UTC');
333 core_date::set_default_server_timezone();
334 $this->assertSame('Etc/GMT-1', date_default_timezone_get());
337 public function legacyUserTimezoneProvider() {
338 return [
339 ['', 'Australia/Perth'], // Fallback on default timezone.
340 ['-13.0', 'Australia/Perth'], // Fallback on default timezone.
341 ['-12.5', 'Etc/GMT+12'],
342 ['-12.0', 'Etc/GMT+12'],
343 ['-11.5', 'Etc/GMT+11'],
344 ['-11.0', 'Etc/GMT+11'],
345 ['-10.5', 'Etc/GMT+10'],
346 ['-10.0', 'Etc/GMT+10'],
347 ['-9.5', 'Etc/GMT+9'],
348 ['-9.0', 'Etc/GMT+9'],
349 ['-8.5', 'Etc/GMT+8'],
350 ['-8.0', 'Etc/GMT+8'],
351 ['-7.5', 'Etc/GMT+7'],
352 ['-7.0', 'Etc/GMT+7'],
353 ['-6.5', 'Etc/GMT+6'],
354 ['-6.0', 'Etc/GMT+6'],
355 ['-5.5', 'Etc/GMT+5'],
356 ['-5.0', 'Etc/GMT+5'],
357 ['-4.5', 'Etc/GMT+4'],
358 ['-4.0', 'Etc/GMT+4'],
359 ['-3.5', 'Etc/GMT+3'],
360 ['-3.0', 'Etc/GMT+3'],
361 ['-2.5', 'Etc/GMT+2'],
362 ['-2.0', 'Etc/GMT+2'],
363 ['-1.5', 'Etc/GMT+1'],
364 ['-1.0', 'Etc/GMT+1'],
365 ['-0.5', 'Etc/GMT'],
366 ['0', 'Etc/GMT'],
367 ['0.0', 'Etc/GMT'],
368 ['0.5', 'Etc/GMT'],
369 ['1.0', 'Etc/GMT-1'],
370 ['1.5', 'Etc/GMT-1'],
371 ['2.0', 'Etc/GMT-2'],
372 ['2.5', 'Etc/GMT-2'],
373 ['3.0', 'Etc/GMT-3'],
374 ['3.5', 'Etc/GMT-3'],
375 ['4.0', 'Etc/GMT-4'],
376 ['4.5', 'Asia/Kabul'],
377 ['5.0', 'Etc/GMT-5'],
378 ['5.5', 'Asia/Kolkata'],
379 ['6.0', 'Etc/GMT-6'],
380 ['6.5', 'Asia/Rangoon'],
381 ['7.0', 'Etc/GMT-7'],
382 ['7.5', 'Etc/GMT-7'],
383 ['8.0', 'Etc/GMT-8'],
384 ['8.5', 'Etc/GMT-8'],
385 ['9.0', 'Etc/GMT-9'],
386 ['9.5', 'Australia/Darwin'],
387 ['10.0', 'Etc/GMT-10'],
388 ['10.5', 'Etc/GMT-10'],
389 ['11.0', 'Etc/GMT-11'],
390 ['11.5', 'Etc/GMT-11'],
391 ['12.0', 'Etc/GMT-12'],
392 ['12.5', 'Etc/GMT-12'],
393 ['13.0', 'Etc/GMT-13'],
398 * @dataProvider legacyUserTimezoneProvider
399 * @param string $tz The legacy timezone.
400 * @param string $expected The expected converted timezone.
402 public function test_get_legacy_user_timezone($tz, $expected) {
403 $this->setTimezone('Australia/Perth', 'Australia/Perth');
404 $this->assertEquals($expected, core_date::get_user_timezone($tz));
407 public function test_get_user_timezone() {
408 global $CFG, $USER;
409 $this->resetAfterTest();
411 // Null parameter.
413 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
414 $USER->timezone = 'Pacific/Auckland';
415 $CFG->forcetimezone = '99';
416 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone(null));
417 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone());
419 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
420 $USER->timezone = 'Pacific/Auckland';
421 $CFG->forcetimezone = 'Europe/Berlin';
422 $this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
423 $this->assertSame('Europe/Berlin', core_date::get_user_timezone());
425 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
426 $USER->timezone = 'Pacific/Auckland';
427 $CFG->forcetimezone = 'xxx/yyy';
428 $this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
429 $this->assertSame('Europe/Prague', core_date::get_user_timezone());
431 $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
432 $USER->timezone = 'abc/def';
433 $CFG->forcetimezone = '99';
434 $this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
435 $this->assertSame('Europe/Prague', core_date::get_user_timezone());
437 $this->setTimezone('xxx/yyy', 'Europe/London');
438 $USER->timezone = 'abc/def';
439 $CFG->forcetimezone = 'Europe/Berlin';
440 $this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
441 $this->assertSame('Europe/Berlin', core_date::get_user_timezone());
443 $this->setTimezone('xxx/yyy', 'Europe/London');
444 $USER->timezone = 'abc/def';
445 $CFG->forcetimezone = 99;
446 $this->assertSame('Europe/London', core_date::get_user_timezone(null));
447 $this->assertSame('Europe/London', core_date::get_user_timezone());
449 // User object parameter.
450 $admin = get_admin();
452 $this->setTimezone('Europe/London');
453 $USER->timezone = 'Pacific/Auckland';
454 $CFG->forcetimezone = '99';
455 $admin->timezone = 'Australia/Perth';
456 $this->assertSame('Australia/Perth', core_date::get_user_timezone($admin));
458 $this->setTimezone('Europe/Prague');
459 $USER->timezone = 'Pacific/Auckland';
460 $CFG->forcetimezone = '99';
461 $admin->timezone = '99';
462 $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
464 $this->setTimezone('99', 'Europe/London');
465 $USER->timezone = 'Pacific/Auckland';
466 $CFG->forcetimezone = '99';
467 $admin->timezone = '99';
468 $this->assertSame('Europe/London', core_date::get_user_timezone($admin));
470 $this->setTimezone('Europe/Prague');
471 $USER->timezone = 'Pacific/Auckland';
472 $CFG->forcetimezone = '99';
473 $admin->timezone = 'xx/zz';
474 $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
476 $this->setTimezone('Europe/Prague');
477 $USER->timezone = 'Pacific/Auckland';
478 $CFG->forcetimezone = '99';
479 unset($admin->timezone);
480 $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
482 $this->setTimezone('Europe/Prague');
483 $USER->timezone = 'Pacific/Auckland';
484 $CFG->forcetimezone = 'Europe/Berlin';
485 $admin->timezone = 'Australia/Perth';
486 $this->assertSame('Europe/Berlin', core_date::get_user_timezone($admin));
488 // Other scalar parameter.
490 $this->setTimezone('Europe/Prague');
491 $CFG->forcetimezone = '99';
493 $USER->timezone = 'Pacific/Auckland';
494 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
495 $this->assertSame('Etc/GMT-1', core_date::get_user_timezone('1'));
496 $this->assertSame('Etc/GMT+1', core_date::get_user_timezone(-1));
497 $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
498 $USER->timezone = '99';
499 $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
500 $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
501 $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
502 $USER->timezone = 'xxz/zzz';
503 $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
505 $this->setTimezone('99', 'Europe/Prague');
506 $CFG->forcetimezone = '99';
508 $USER->timezone = 'Pacific/Auckland';
509 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
510 $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
511 $USER->timezone = '99';
512 $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
513 $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
514 $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
515 $USER->timezone = 99;
516 $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
517 $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
518 $USER->timezone = 'xxz/zzz';
519 $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
521 $this->setTimezone('xxx', 'Europe/Prague');
522 $CFG->forcetimezone = '99';
523 $USER->timezone = 'xxx';
524 $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
525 $this->assertSame('Europe/Prague', core_date::get_user_timezone(99));
526 $this->assertSame('Etc/GMT-1', core_date::get_user_timezone(1));
528 $this->setTimezone('Europe/Prague');
529 $CFG->forcetimezone = 'Pacific/Auckland';
530 $USER->timezone = 'Europe/London';
531 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone(99));
532 $this->assertSame('Europe/Berlin', core_date::get_user_timezone('Europe/Berlin'));
534 // TZ object param.
536 $this->setTimezone('UTC');
537 $USER->timezone = 'Europe/London';
538 $CFG->forcetimezone = 99;
539 $tz = new DateTimeZone('Pacific/Auckland');
540 $this->assertSame('Pacific/Auckland', core_date::get_user_timezone($tz));
543 public function test_get_user_timezone_object() {
544 global $CFG, $USER;
545 $this->resetAfterTest();
547 $this->setTimezone('Pacific/Auckland');
548 $CFG->forcetimezone = '99';
550 $zones = core_date::get_list_of_timezones();
551 foreach ($zones as $zone) {
552 $USER->timezone = $zone;
553 $tz = core_date::get_user_timezone_object();
554 $this->assertInstanceOf('DateTimeZone', $tz);
555 $this->assertSame($zone, $tz->getName());