From 241e82b28482092413d8629cd37e3436ddc451b4 Mon Sep 17 00:00:00 2001 From: oleibman Date: Sat, 23 Oct 2021 18:23:53 -0700 Subject: [PATCH] Unexpected Format in Timestamp (#2332) See issue #2331. Timestamp is expected in format yyyy-mm-dd (plus other information), with the expectation that month and day are 2 digits zero-filled on the left if needed. The user's file instead used a space rather than zero as filler. Although I don't know how the unexpected timestamp was created, it was easy enough to alter the timestamp in an otherwise normal spreadsheet, and use that file as a test case. --- src/PhpSpreadsheet/Document/Properties.php | 2 ++ src/PhpSpreadsheet/Reader/Xlsx/Properties.php | 4 +-- .../Reader/Xlsx/Issue2331Test.php | 26 ++++++++++++++++++ tests/data/Reader/XLSX/issue.2331c.xlsx | Bin 0 -> 8421 bytes 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2331Test.php create mode 100644 tests/data/Reader/XLSX/issue.2331c.xlsx diff --git a/src/PhpSpreadsheet/Document/Properties.php b/src/PhpSpreadsheet/Document/Properties.php index 1030d98c..99e66756 100644 --- a/src/PhpSpreadsheet/Document/Properties.php +++ b/src/PhpSpreadsheet/Document/Properties.php @@ -172,6 +172,8 @@ class Properties $timestamp = (float) $timestamp; } else { $timestamp = preg_replace('/[.][0-9]*$/', '', $timestamp) ?? ''; + $timestamp = preg_replace('/^(\\d{4})- (\\d)/', '$1-0$2', $timestamp) ?? ''; + $timestamp = preg_replace('/^(\\d{4}-\\d{2})- (\\d)/', '$1-0$2', $timestamp) ?? ''; $timestamp = (float) (new DateTime($timestamp))->format('U'); } } diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Properties.php b/src/PhpSpreadsheet/Reader/Xlsx/Properties.php index fb341f71..82b5172b 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Properties.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Properties.php @@ -52,8 +52,8 @@ class Properties $this->docProps->setCreator((string) self::getArrayItem($xmlCore->xpath('dc:creator'))); $this->docProps->setLastModifiedBy((string) self::getArrayItem($xmlCore->xpath('cp:lastModifiedBy'))); - $this->docProps->setCreated((int) strtotime((string) self::getArrayItem($xmlCore->xpath('dcterms:created')))); //! respect xsi:type - $this->docProps->setModified((int) strtotime((string) self::getArrayItem($xmlCore->xpath('dcterms:modified')))); //! respect xsi:type + $this->docProps->setCreated((string) self::getArrayItem($xmlCore->xpath('dcterms:created'))); //! respect xsi:type + $this->docProps->setModified((string) self::getArrayItem($xmlCore->xpath('dcterms:modified'))); //! respect xsi:type $this->docProps->setTitle((string) self::getArrayItem($xmlCore->xpath('dc:title'))); $this->docProps->setDescription((string) self::getArrayItem($xmlCore->xpath('dc:description'))); $this->docProps->setSubject((string) self::getArrayItem($xmlCore->xpath('dc:subject'))); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2331Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2331Test.php new file mode 100644 index 00000000..afa2ff52 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2331Test.php @@ -0,0 +1,26 @@ +load($filename); + $properties = $spreadsheet->getProperties(); + $created = (string) $properties->getCreated(); + $modified = (string) $properties->getModified(); + + self::assertEquals('2021-08-02', Date::formattedDateTimeFromTimestamp($created, 'Y-m-d', new DateTimeZone('UTC'))); + self::assertEquals('2021-09-03', Date::formattedDateTimeFromTimestamp($modified, 'Y-m-d', new DateTimeZone('UTC'))); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.2331c.xlsx b/tests/data/Reader/XLSX/issue.2331c.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f069bcd8c35ecfef071de2b970c22c9cca94f49 GIT binary patch literal 8421 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 literal 0 HcmV?d00001