| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- namespace PhpOffice\PhpSpreadsheetTests\Shared;
- use DateTimeZone;
- use PhpOffice\PhpSpreadsheet\Exception;
- use PhpOffice\PhpSpreadsheet\Shared\Date;
- use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
- use PHPUnit\Framework\TestCase;
- class DateTest extends TestCase
- {
- /**
- * @var int
- */
- private $excelCalendar;
- /**
- * @var null|DateTimeZone
- */
- private $dttimezone;
- protected function setUp(): void
- {
- $this->dttimezone = Date::getDefaultTimeZoneOrNull();
- $this->excelCalendar = Date::getExcelCalendar();
- }
- protected function tearDown(): void
- {
- Date::setDefaultTimeZone($this->dttimezone);
- Date::setExcelCalendar($this->excelCalendar);
- }
- public function testSetExcelCalendar(): void
- {
- $calendarValues = [
- Date::CALENDAR_MAC_1904,
- Date::CALENDAR_WINDOWS_1900,
- ];
- foreach ($calendarValues as $calendarValue) {
- $result = Date::setExcelCalendar($calendarValue);
- self::assertTrue($result);
- }
- }
- public function testSetExcelCalendarWithInvalidValue(): void
- {
- $unsupportedCalendar = 2012;
- $result = Date::setExcelCalendar($unsupportedCalendar);
- self::assertFalse($result);
- }
- /**
- * @dataProvider providerDateTimeExcelToTimestamp1900
- *
- * @param mixed $expectedResult
- * @param mixed $excelDateTimeValue
- */
- public function testDateTimeExcelToTimestamp1900($expectedResult, $excelDateTimeValue): void
- {
- if (is_numeric($expectedResult) && ($expectedResult > PHP_INT_MAX || $expectedResult < PHP_INT_MIN)) {
- self::markTestSkipped('Test invalid on 32-bit system.');
- }
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $result = Date::excelToTimestamp($excelDateTimeValue);
- self::assertEquals($expectedResult, $result);
- }
- public function providerDateTimeExcelToTimestamp1900(): array
- {
- return require 'tests/data/Shared/Date/ExcelToTimestamp1900.php';
- }
- /**
- * @dataProvider providerDateTimeTimestampToExcel1900
- *
- * @param mixed $expectedResult
- * @param mixed $unixTimestamp
- */
- public function testDateTimeTimestampToExcel1900($expectedResult, $unixTimestamp): void
- {
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $result = Date::timestampToExcel($unixTimestamp);
- self::assertEqualsWithDelta($expectedResult, $result, 1E-5);
- }
- public function providerDateTimeTimestampToExcel1900(): array
- {
- return require 'tests/data/Shared/Date/TimestampToExcel1900.php';
- }
- /**
- * @dataProvider providerDateTimeDateTimeToExcel
- *
- * @param mixed $expectedResult
- * @param mixed $dateTimeObject
- */
- public function testDateTimeDateTimeToExcel($expectedResult, $dateTimeObject): void
- {
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $result = Date::dateTimeToExcel($dateTimeObject);
- self::assertEqualsWithDelta($expectedResult, $result, 1E-5);
- }
- public function providerDateTimeDateTimeToExcel(): array
- {
- return require 'tests/data/Shared/Date/DateTimeToExcel.php';
- }
- /**
- * @dataProvider providerDateTimeFormattedPHPToExcel1900
- *
- * @param mixed $expectedResult
- */
- public function testDateTimeFormattedPHPToExcel1900($expectedResult, ...$args): void
- {
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $result = Date::formattedPHPToExcel(...$args);
- self::assertEqualsWithDelta($expectedResult, $result, 1E-5);
- }
- public function providerDateTimeFormattedPHPToExcel1900(): array
- {
- return require 'tests/data/Shared/Date/FormattedPHPToExcel1900.php';
- }
- /**
- * @dataProvider providerDateTimeExcelToTimestamp1904
- *
- * @param mixed $expectedResult
- * @param mixed $excelDateTimeValue
- */
- public function testDateTimeExcelToTimestamp1904($expectedResult, $excelDateTimeValue): void
- {
- if (is_numeric($expectedResult) && ($expectedResult > PHP_INT_MAX || $expectedResult < PHP_INT_MIN)) {
- self::markTestSkipped('Test invalid on 32-bit system.');
- }
- Date::setExcelCalendar(Date::CALENDAR_MAC_1904);
- $result = Date::excelToTimestamp($excelDateTimeValue);
- self::assertEquals($expectedResult, $result);
- }
- public function providerDateTimeExcelToTimestamp1904(): array
- {
- return require 'tests/data/Shared/Date/ExcelToTimestamp1904.php';
- }
- /**
- * @dataProvider providerDateTimeTimestampToExcel1904
- *
- * @param mixed $expectedResult
- * @param mixed $unixTimestamp
- */
- public function testDateTimeTimestampToExcel1904($expectedResult, $unixTimestamp): void
- {
- Date::setExcelCalendar(Date::CALENDAR_MAC_1904);
- $result = Date::timestampToExcel($unixTimestamp);
- self::assertEqualsWithDelta($expectedResult, $result, 1E-5);
- }
- public function providerDateTimeTimestampToExcel1904(): array
- {
- return require 'tests/data/Shared/Date/TimestampToExcel1904.php';
- }
- /**
- * @dataProvider providerIsDateTimeFormatCode
- *
- * @param mixed $expectedResult
- */
- public function testIsDateTimeFormatCode($expectedResult, string $format): void
- {
- $result = Date::isDateTimeFormatCode($format);
- self::assertEquals($expectedResult, $result);
- }
- public function providerIsDateTimeFormatCode(): array
- {
- return require 'tests/data/Shared/Date/FormatCodes.php';
- }
- /**
- * @dataProvider providerDateTimeExcelToTimestamp1900Timezone
- *
- * @param mixed $expectedResult
- * @param mixed $excelDateTimeValue
- * @param mixed $timezone
- */
- public function testDateTimeExcelToTimestamp1900Timezone($expectedResult, $excelDateTimeValue, $timezone): void
- {
- if (is_numeric($expectedResult) && ($expectedResult > PHP_INT_MAX || $expectedResult < PHP_INT_MIN)) {
- self::markTestSkipped('Test invalid on 32-bit system.');
- }
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $result = Date::excelToTimestamp($excelDateTimeValue, $timezone);
- self::assertEquals($expectedResult, $result);
- }
- public function providerDateTimeExcelToTimestamp1900Timezone(): array
- {
- return require 'tests/data/Shared/Date/ExcelToTimestamp1900Timezone.php';
- }
- public function testConvertIsoDateError(): void
- {
- Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900);
- $this->expectException(Exception::class);
- $this->expectExceptionMessage('Non-string value supplied for Iso Date conversion');
- Date::convertIsoDate(false);
- }
- public function testVarious(): void
- {
- Date::setDefaultTimeZone('UTC');
- self::assertFalse(Date::stringToExcel('2019-02-29'));
- self::assertTrue((bool) Date::stringToExcel('2019-02-28'));
- self::assertTrue((bool) Date::stringToExcel('2019-02-28 11:18'));
- self::assertFalse(Date::stringToExcel('2019-02-28 11:71'));
- $date = Date::PHPToExcel('2020-01-01');
- self::assertEquals(43831.0, $date);
- $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- $sheet->setCellValue('B1', 'x');
- $val = $sheet->getCell('B1')->getValue();
- self::assertFalse(Date::timestampToExcel($val));
- $cell = $sheet->getCell('A1');
- self::assertNotNull($cell);
- $cell->setValue($date);
- $sheet->getStyle('A1')
- ->getNumberFormat()
- ->setFormatCode(NumberFormat::FORMAT_DATE_DATETIME);
- self::assertTrue(null !== $cell && Date::isDateTime($cell));
- $cella2 = $sheet->getCell('A2');
- self::assertNotNull($cella2);
- $cella2->setValue('=A1+2');
- $sheet->getStyle('A2')
- ->getNumberFormat()
- ->setFormatCode(NumberFormat::FORMAT_DATE_DATETIME);
- self::assertTrue(null !== $cella2 && Date::isDateTime($cella2));
- $cella3 = $sheet->getCell('A3');
- self::assertNotNull($cella3);
- $cella3->setValue('=A1+4');
- $sheet->getStyle('A3')
- ->getNumberFormat()
- ->setFormatCode('0.00E+00');
- self::assertFalse(null !== $cella3 && Date::isDateTime($cella3));
- }
- }
|