diff --git a/Examples/runall.php b/Examples/runall.php index 153cb765..2a560c63 100644 --- a/Examples/runall.php +++ b/Examples/runall.php @@ -89,6 +89,7 @@ $aTests = array( , '33chartcreate-line.php' , '33chartcreate-pie.php' , '33chartcreate-radar.php' + , '33chartcreate-scatter.php' , '33chartcreate-stock.php' , '33chartcreate-multiple-charts.php' , '33chartcreate-composite.php' diff --git a/src/PhpSpreadsheet/Shared/Date.php b/src/PhpSpreadsheet/Shared/Date.php index 06afeb8b..6bc1cf79 100644 --- a/src/PhpSpreadsheet/Shared/Date.php +++ b/src/PhpSpreadsheet/Shared/Date.php @@ -167,10 +167,17 @@ class Date public static function excelToDateTimeObject($excelTimestamp = 0, $timeZone = null) { $timeZone = ($timeZone === null) ? self::getDefaultTimezone() : self::validateTimeZone($timeZone); - if (self::$excelCalendar == self::CALENDAR_WINDOWS_1900) { - $baseDate = ($excelTimestamp < 60) ? new \DateTime('1899-12-31', $timeZone) : new \DateTime('1899-12-30', $timeZone); + if ($excelTimestamp < 1.0) { + // Unix timestamp base date + $baseDate = new \DateTime('1970-01-01', $timeZone); } else { - $baseDate = new \DateTime('1904-01-01', $timeZone); + // MS Excel calendar base dates + if (self::$excelCalendar == self::CALENDAR_WINDOWS_1900) { + // Allow adjustment for 1900 Leap Year in MS Excel + $baseDate = ($excelTimestamp < 60) ? new \DateTime('1899-12-31', $timeZone) : new \DateTime('1899-12-30', $timeZone); + } else { + $baseDate = new \DateTime('1904-01-01', $timeZone); + } } $days = floor($excelTimestamp); $partDay = $excelTimestamp - $days; @@ -178,8 +185,7 @@ class Date $partDay = $partDay * 24 - $hours; $minutes = floor($partDay * 60); $partDay = $partDay * 60 - $minutes; - $seconds = floor($partDay * 60); -// $fraction = $partDay - $seconds; + $seconds = round($partDay * 60); $interval = '+' . $days . ' days'; return $baseDate->modify($interval) @@ -195,7 +201,7 @@ class Date */ public static function excelToTimestamp($excelTimestamp = 0, $timeZone = null) { - return self::excelToDateTimeObject($excelTimestamp, $timeZone) + return (int) self::excelToDateTimeObject($excelTimestamp, $timeZone) ->format('U'); } diff --git a/unitTests/Classes/src/Shared/DateTest.php b/unitTests/Classes/src/Shared/DateTest.php index cf531a81..12fff713 100644 --- a/unitTests/Classes/src/Shared/DateTest.php +++ b/unitTests/Classes/src/Shared/DateTest.php @@ -27,9 +27,9 @@ class DateTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider providerDateTimeExcelToPHP1900 + * @dataProvider providerDateTimeExcelToTimestamp1900 */ - public function testDateTimeExcelToPHP1900() + public function testDateTimeExcelToTimestamp1900() { $result = call_user_func( array('\PHPExcel\Shared\Date','setExcelCalendar'), @@ -38,16 +38,13 @@ class DateTest extends \PHPUnit_Framework_TestCase $args = func_get_args(); $expectedResult = array_pop($args); - if ($args[0] < 1) { - $expectedResult += gmmktime(0, 0, 0); - } - $result = call_user_func_array(array('\PHPExcel\Shared\Date', 'ExcelToPHP'), $args); + $result = call_user_func_array(array('\PHPExcel\Shared\Date', 'excelToTimestamp'), $args); $this->assertEquals($expectedResult, $result); } - public function providerDateTimeExcelToPHP1900() + public function providerDateTimeExcelToTimestamp1900() { - return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToPHP1900.data'); + return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToTimestamp1900.data'); } /** @@ -93,9 +90,9 @@ class DateTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider providerDateTimeExcelToPHP1904 + * @dataProvider providerDateTimeExcelToTimestamp1904 */ - public function testDateTimeExcelToPHP1904() + public function testDateTimeExcelToTimestamp1904() { $result = call_user_func( array('\PHPExcel\Shared\Date','setExcelCalendar'), @@ -104,16 +101,13 @@ class DateTest extends \PHPUnit_Framework_TestCase $args = func_get_args(); $expectedResult = array_pop($args); - if ($args[0] < 1) { - $expectedResult += gmmktime(0, 0, 0); - } - $result = call_user_func_array(array('\PHPExcel\Shared\Date','ExcelToPHP'), $args); + $result = call_user_func_array(array('\PHPExcel\Shared\Date','excelToTimestamp'), $args); $this->assertEquals($expectedResult, $result); } - public function providerDateTimeExcelToPHP1904() + public function providerDateTimeExcelToTimestamp1904() { - return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToPHP1904.data'); + return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToTimestamp1904.data'); } /** @@ -154,10 +148,10 @@ class DateTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider providerDateTimeExcelToPHP1900Timezone + * @dataProvider providerDateTimeExcelToTimestamp1900Timezone * @group fail19 */ - public function testDateTimeExcelToPHP1900Timezone() + public function testDateTimeExcelToTimestamp1900Timezone() { $result = call_user_func( array('\PHPExcel\Shared\Date','setExcelCalendar'), @@ -166,15 +160,12 @@ class DateTest extends \PHPUnit_Framework_TestCase $args = func_get_args(); $expectedResult = array_pop($args); - if ($args[0] < 1) { - $expectedResult += gmmktime(0, 0, 0); - } - $result = call_user_func_array(array('\PHPExcel\Shared\Date','ExcelToPHP'), $args); + $result = call_user_func_array(array('\PHPExcel\Shared\Date','excelToTimestamp'), $args); $this->assertEquals($expectedResult, $result); } - public function providerDateTimeExcelToPHP1900Timezone() + public function providerDateTimeExcelToTimestamp1900Timezone() { - return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToPHP1900Timezone.data'); + return new \PhpSpreadhsheet\unitTests\TestDataFileIterator('rawTestData/Shared/DateTimeExcelToTimestamp1900Timezone.data'); } } diff --git a/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900Timezone.data b/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900Timezone.data deleted file mode 100644 index e106b5fe..00000000 --- a/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900Timezone.data +++ /dev/null @@ -1,23 +0,0 @@ -#Excel DateTimeStamp Adjust Timezone Result Comments -22269, TRUE, 'America/New_York', -285138000 // 19-Dec-1960 00:00:00 UST -25569, TRUE, 'America/New_York', -18000 // PHP Base Date 01-Jan-1970 00:00:00 UST -30292, TRUE, 'America/New_York', 408049200 // 07-Dec-1982 00:00:00 UST -39611, TRUE, 'America/New_York', 1213214400 // 12-Jun-2008 00:00:00 UST -50424, TRUE, 'America/New_York', 2147454000 // PHP 32-bit Latest Date 19-Jan-2038 00:00:00 UST -22345.56789, TRUE, 'America/New_York', -278522534 // 18-May-1903 13:37:46 UST -22345.6789, TRUE, 'America/New_York', -278512943 // 18-Oct-1933 16:17:37 UST -0.5, TRUE, 'America/New_York', 25200 // 12:00:00 UST -0.75, TRUE, 'America/New_York', 46800 // 18:00.00 UST -0.12345, TRUE, 'America/New_York', -7334 // 02:57:46 UST -41215, TRUE, 'America/New_York', 1351800000 // 02-Nov-2012 00:00:00 UST -22269, TRUE, 'Pacific/Auckland', -285076800 // 19-Dec-1960 00:00:00 UST -25569, TRUE, 'Pacific/Auckland', 43200 // PHP Base Date 01-Jan-1970 00:00:00 UST -30292, TRUE, 'Pacific/Auckland', 408114000 // 07-Dec-1982 00:00:00 UST -39611, TRUE, 'Pacific/Auckland', 1213272000 // 12-Jun-2008 00:00:00 UST -50423.5, TRUE, 'Pacific/Auckland', 2147475600 // PHP 32-bit Latest Date 19-Jan-2038 00:00:00 UST -22345.56789, TRUE, 'Pacific/Auckland', -278461334 // 18-May-1903 13:37:46 UST -22345.6789, TRUE, 'Pacific/Auckland', -278451743 // 18-Oct-1933 16:17:37 UST -0.5, TRUE, 'Pacific/Auckland', 90000 // 12:00:00 UST -0.75, TRUE, 'Pacific/Auckland', 111600 // 18:00.00 UST -0.12345, TRUE, 'Pacific/Auckland', 57466 // 02:57:46 UST -41215, TRUE, 'Pacific/Auckland', 1351861200 // 02-Nov-2012 00:00:00 UST diff --git a/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900.data b/unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1900.data similarity index 100% rename from unitTests/rawTestData/Shared/DateTimeExcelToPHP1900.data rename to unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1900.data diff --git a/unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1900Timezone.data b/unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1900Timezone.data new file mode 100644 index 00000000..13ecbd10 --- /dev/null +++ b/unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1900Timezone.data @@ -0,0 +1,23 @@ +#Excel DateTimeStamp Timezone Result Comments +22269, 'America/New_York', -285138000 // 19-Dec-1960 00:00:00 UST +25569, 'America/New_York', -18000 // PHP Base Date 01-Jan-1970 00:00:00 UST +30292, 'America/New_York', 408049200 // 07-Dec-1982 00:00:00 UST +39611, 'America/New_York', 1213214400 // 12-Jun-2008 00:00:00 UST +50424, 'America/New_York', 2147454000 // PHP 32-bit Latest Date 19-Jan-2038 00:00:00 UST +22345.56789, 'America/New_York', -278522534 // 18-May-1903 13:37:46 UST +22345.6789, 'America/New_York', -278512943 // 18-Oct-1933 16:17:37 UST +0.5, 'America/New_York', 25200 // 12:00:00 UST +0.75, 'America/New_York', 46800 // 18:00.00 UST +0.12345, 'America/New_York', -7334 // 02:57:46 UST +41215, 'America/New_York', 1351800000 // 02-Nov-2012 00:00:00 UST +22269, 'Pacific/Auckland', -285076800 // 19-Dec-1960 00:00:00 UST +25569, 'Pacific/Auckland', 43200 // PHP Base Date 01-Jan-1970 00:00:00 UST +30292, 'Pacific/Auckland', 408114000 // 07-Dec-1982 00:00:00 UST +39611, 'Pacific/Auckland', 1213272000 // 12-Jun-2008 00:00:00 UST +50423.5, 'Pacific/Auckland', 2147475600 // PHP 32-bit Latest Date 19-Jan-2038 00:00:00 UST +22345.56789, 'Pacific/Auckland', -278461334 // 18-May-1903 13:37:46 UST +22345.6789, 'Pacific/Auckland', -278451743 // 18-Oct-1933 16:17:37 UST +0.5, 'Pacific/Auckland', 90000 // 12:00:00 UST +0.75, 'Pacific/Auckland', 111600 // 18:00.00 UST +0.12345, 'Pacific/Auckland', 57466 // 02:57:46 UST +41215, 'Pacific/Auckland', 1351861200 // 02-Nov-2012 00:00:00 UST diff --git a/unitTests/rawTestData/Shared/DateTimeExcelToPHP1904.data b/unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1904.data similarity index 100% rename from unitTests/rawTestData/Shared/DateTimeExcelToPHP1904.data rename to unitTests/rawTestData/Shared/DateTimeExcelToTimestamp1904.data