diff --git a/samples/Reading_workbook_data/Properties.php b/samples/Reading_workbook_data/Properties.php index 5bf25b8e..8f7be375 100644 --- a/samples/Reading_workbook_data/Properties.php +++ b/samples/Reading_workbook_data/Properties.php @@ -1,6 +1,7 @@ log('Document Creator: ' . $creator); // Read the Date when the workbook was created (as a PHP timestamp value) $creationDatestamp = $spreadsheet->getProperties()->getCreated(); -// Format the date and time using the standard PHP date() function -$creationDate = date('l, d<\s\up>S F Y', $creationDatestamp); -$creationTime = date('g:i A', $creationDatestamp); +$creationDate = Date::formattedDateTimeFromTimestamp("$creationDatestamp", 'l, d<\s\up>S F Y'); +$creationTime = Date::formattedDateTimeFromTimestamp("$creationDatestamp", 'g:i A'); $helper->log('Created On: ' . $creationDate . ' at ' . $creationTime); // Read the name of the last person to modify this workbook @@ -30,8 +30,8 @@ $helper->log('Last Modified By: ' . $modifiedBy); // Read the Date when the workbook was last modified (as a PHP timestamp value) $modifiedDatestamp = $spreadsheet->getProperties()->getModified(); // Format the date and time using the standard PHP date() function -$modifiedDate = date('l, d<\s\up>S F Y', $modifiedDatestamp); -$modifiedTime = date('g:i A', $modifiedDatestamp); +$modifiedDate = Date::formattedDateTimeFromTimestamp("$modifiedDatestamp", 'l, d<\s\up>S F Y'); +$modifiedTime = Date::formattedDateTimeFromTimestamp("$modifiedDatestamp", 'g:i A'); $helper->log('Last Modified On: ' . $modifiedDate . ' at ' . $modifiedTime); // Read the workbook title property diff --git a/src/PhpSpreadsheet/Shared/Date.php b/src/PhpSpreadsheet/Shared/Date.php index 7d4319c3..7ddce046 100644 --- a/src/PhpSpreadsheet/Shared/Date.php +++ b/src/PhpSpreadsheet/Shared/Date.php @@ -501,14 +501,17 @@ class Date return $day; } - public static function dateTimeFromTimestamp(string $date): DateTime + public static function dateTimeFromTimestamp(string $date, ?DateTimeZone $timeZone = null): DateTime { - return DateTime::createFromFormat('U', $date) ?: new DateTime(); + $dtobj = DateTime::createFromFormat('U', $date) ?: new DateTime(); + $dtobj->setTimeZone($timeZone ?? self::getDefaultOrLocalTimezone()); + + return $dtobj; } - public static function formattedDateTimeFromTimestamp(string $date, string $format): string + public static function formattedDateTimeFromTimestamp(string $date, string $format, ?DateTimeZone $timeZone = null): string { - $dtobj = self::dateTimeFromTimestamp($date); + $dtobj = self::dateTimeFromTimestamp($date, $timeZone); return $dtobj->format($format); } diff --git a/src/PhpSpreadsheet/Writer/Ods/Meta.php b/src/PhpSpreadsheet/Writer/Ods/Meta.php index 9504ed7c..16f7c8b5 100644 --- a/src/PhpSpreadsheet/Writer/Ods/Meta.php +++ b/src/PhpSpreadsheet/Writer/Ods/Meta.php @@ -82,7 +82,7 @@ class Meta extends WriterPart return $objWriter->getData(); } - private function writeDocPropsCustom(XMLWriter $objWriter, Spreadsheet $spreadsheet): void + private static function writeDocPropsCustom(XMLWriter $objWriter, Spreadsheet $spreadsheet): void { $customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); foreach ($customPropertyList as $key => $customProperty) { @@ -106,7 +106,7 @@ class Meta extends WriterPart break; case Properties::PROPERTY_TYPE_DATE: $objWriter->writeAttribute('meta:value-type', 'date'); - $dtobj = Date::dateTimeFromTimestamp($propertyValue); + $dtobj = Date::dateTimeFromTimestamp($propertyValue ?? 0); $objWriter->writeRawData($dtobj->format(DATE_W3C)); break; diff --git a/tests/PhpSpreadsheetTests/Document/PropertiesTest.php b/tests/PhpSpreadsheetTests/Document/PropertiesTest.php index 4583e240..c539da09 100644 --- a/tests/PhpSpreadsheetTests/Document/PropertiesTest.php +++ b/tests/PhpSpreadsheetTests/Document/PropertiesTest.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Document; +use DateTimeZone; use PhpOffice\PhpSpreadsheet\Document\Properties; use PhpOffice\PhpSpreadsheet\Shared\Date; use PHPUnit\Framework\TestCase; @@ -163,7 +164,7 @@ class PropertiesTest extends TestCase self::assertSame($expectedType, $this->properties->getCustomPropertyType($propertyName)); $result = $this->properties->getCustomPropertyValue($propertyName); if ($expectedType === Properties::PROPERTY_TYPE_DATE) { - $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d'); + $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d', new DateTimeZone('UTC')); } self::assertSame($expectedValue, $result); } diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/PropertiesTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/PropertiesTest.php index 1e2bd841..bb414da5 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/PropertiesTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/PropertiesTest.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx; +use DateTimeZone; use PhpOffice\PhpSpreadsheet\Document\Properties; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Shared\Date; @@ -44,7 +45,7 @@ class PropertiesTest extends AbstractFunctional self::assertSame($testData['type'], $properties->getCustomPropertyType($propertyName)); $result = $properties->getCustomPropertyValue($propertyName); if ($properties->getCustomPropertyType($propertyName) == Properties::PROPERTY_TYPE_DATE) { - $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d'); + $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d', new DateTimeZone('UTC')); } self::assertSame($testData['value'], $result); } @@ -86,7 +87,7 @@ class PropertiesTest extends AbstractFunctional self::assertSame($testData['type'], $properties->getCustomPropertyType($propertyName)); $result = $properties->getCustomPropertyValue($propertyName); if ($properties->getCustomPropertyType($propertyName) == Properties::PROPERTY_TYPE_DATE) { - $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d'); + $result = Date::formattedDateTimeFromTimestamp("$result", 'Y-m-d', new DateTimeZone('UTC')); } self::assertSame($testData['value'], $result); }