2012-11-03 21:52:55 +00:00
|
|
|
<?php
|
|
|
|
|
2016-08-31 17:18:12 +00:00
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Shared;
|
2012-11-03 21:52:55 +00:00
|
|
|
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
use DateTime;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
2016-08-31 17:18:12 +00:00
|
|
|
use PhpOffice\PhpSpreadsheet\Shared\TimeZone;
|
2017-11-08 15:48:01 +00:00
|
|
|
use PHPUnit\Framework\TestCase;
|
2016-08-14 04:08:43 +00:00
|
|
|
|
2017-11-08 15:48:01 +00:00
|
|
|
class TimeZoneTest extends TestCase
|
2012-11-03 21:52:55 +00:00
|
|
|
{
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
private $tztimezone;
|
|
|
|
|
|
|
|
private $dttimezone;
|
|
|
|
|
|
|
|
protected function setUp(): void
|
|
|
|
{
|
|
|
|
$this->tztimezone = TimeZone::getTimeZone();
|
|
|
|
$this->dttimezone = Date::getDefaultTimeZone();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function tearDown(): void
|
|
|
|
{
|
|
|
|
TimeZone::setTimeZone($this->tztimezone);
|
|
|
|
Date::setDefaultTimeZone($this->dttimezone);
|
|
|
|
}
|
|
|
|
|
2020-05-18 04:49:57 +00:00
|
|
|
public function testSetTimezone(): void
|
2015-05-17 13:00:02 +00:00
|
|
|
{
|
2016-08-16 15:33:57 +00:00
|
|
|
$timezoneValues = [
|
2015-05-17 13:00:02 +00:00
|
|
|
'Europe/Prague',
|
|
|
|
'Asia/Tokyo',
|
|
|
|
'America/Indiana/Indianapolis',
|
|
|
|
'Pacific/Honolulu',
|
|
|
|
'Atlantic/St_Helena',
|
2016-08-16 15:33:57 +00:00
|
|
|
];
|
2015-05-17 13:00:02 +00:00
|
|
|
|
|
|
|
foreach ($timezoneValues as $timezoneValue) {
|
2016-08-26 06:39:29 +00:00
|
|
|
$result = TimeZone::setTimezone($timezoneValue);
|
2017-09-20 05:55:42 +00:00
|
|
|
self::assertTrue($result);
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
$result = Date::setDefaultTimezone($timezoneValue);
|
|
|
|
self::assertTrue($result);
|
2015-05-17 13:00:02 +00:00
|
|
|
}
|
|
|
|
}
|
2012-11-03 21:52:55 +00:00
|
|
|
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
public function testSetTimezoneBackwardCompatible(): void
|
|
|
|
{
|
|
|
|
$bcTimezone = 'Etc/GMT+10';
|
|
|
|
$result = TimeZone::setTimezone($bcTimezone);
|
|
|
|
self::assertTrue($result);
|
|
|
|
$result = Date::setDefaultTimezone($bcTimezone);
|
|
|
|
self::assertTrue($result);
|
|
|
|
}
|
|
|
|
|
2020-05-18 04:49:57 +00:00
|
|
|
public function testSetTimezoneWithInvalidValue(): void
|
2015-05-17 13:00:02 +00:00
|
|
|
{
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
$unsupportedTimezone = 'XEtc/GMT+10';
|
2016-08-26 06:39:29 +00:00
|
|
|
$result = TimeZone::setTimezone($unsupportedTimezone);
|
2017-09-20 05:55:42 +00:00
|
|
|
self::assertFalse($result);
|
Fix Issue 1441 (isDateTime and Formulas) (#1480)
* Fix Issue 1441 (isDateTime and Formulas)
When you have a date-field which is a formula, isDateTime returns false.
https://github.com/PHPOffice/PhpSpreadsheet/issues/1441
Report makes sense; fixed as suggested. Also fixed a few minor
related issues, and added tests so that Shared/Date and Shared/TimeZone
are now completely covered.
Date/setDefaultTimeZone and TimeZone/setTimeZone were not consistent
about what to do in event of failure - return false or throw.
They will now both return false, which is what Date's function
said it would do in its doc block anyhow. Date/validateTimeZone will
continue to throw; it was protected, but was never called outside
Date, so I changed it to private.
TimeZone/getTimeZoneAdjustment checked for 'UST' when it probably
meant 'UTC', and, as it turns out, the check is not even needed.
The most serious problem was that TimeZone/validateTimeZone does not
check the backwards-compatible time zones. The timezone project
aggressively, and very controversially, "demotes" timezones;
such timezones eventually wind up in the PHP backwards-compatible list.
We want to make sure to check that list so that our applications do not
break when this happens.
2020-05-24 18:02:39 +00:00
|
|
|
$result = Date::setDefaultTimezone($unsupportedTimezone);
|
|
|
|
self::assertFalse($result);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testTimeZoneAdjustmentsInvalidTz(): void
|
|
|
|
{
|
|
|
|
$this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
|
|
|
|
$dtobj = DateTime::createFromFormat('Y-m-d H:i:s', '2008-09-22 00:00:00');
|
|
|
|
$tstmp = $dtobj->getTimestamp();
|
|
|
|
$unsupportedTimeZone = 'XEtc/GMT+10';
|
|
|
|
TimeZone::getTimeZoneAdjustment($unsupportedTimeZone, $tstmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testTimeZoneAdjustments(): void
|
|
|
|
{
|
|
|
|
$dtobj = DateTime::createFromFormat('Y-m-d H:i:s', '2008-01-01 00:00:00');
|
|
|
|
$tstmp = $dtobj->getTimestamp();
|
|
|
|
$supportedTimeZone = 'UTC';
|
|
|
|
$adj = TimeZone::getTimeZoneAdjustment($supportedTimeZone, $tstmp);
|
|
|
|
self::assertEquals(0, $adj);
|
|
|
|
$supportedTimeZone = 'America/Toronto';
|
|
|
|
$adj = TimeZone::getTimeZoneAdjustment($supportedTimeZone, $tstmp);
|
|
|
|
self::assertEquals(-18000, $adj);
|
|
|
|
$supportedTimeZone = 'America/Chicago';
|
|
|
|
TimeZone::setTimeZone($supportedTimeZone);
|
|
|
|
$adj = TimeZone::getTimeZoneAdjustment(null, $tstmp);
|
|
|
|
self::assertEquals(-21600, $adj);
|
2015-05-17 13:00:02 +00:00
|
|
|
}
|
2012-11-03 21:52:55 +00:00
|
|
|
}
|