| 
									
										
										
										
											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
										 |  |  | } |