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\s\up> F Y', $creationDatestamp);
-$creationTime = date('g:i A', $creationDatestamp);
+$creationDate = Date::formattedDateTimeFromTimestamp("$creationDatestamp", 'l, d<\s\up>S\s\up> 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\s\up> F Y', $modifiedDatestamp);
-$modifiedTime = date('g:i A', $modifiedDatestamp);
+$modifiedDate = Date::formattedDateTimeFromTimestamp("$modifiedDatestamp", 'l, d<\s\up>S\s\up> 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);
}