EpochTest.php 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Document;
  3. use DateTime;
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
  6. class EpochTest extends AbstractFunctional
  7. {
  8. public function providerFormats(): array
  9. {
  10. return [
  11. ['Ods', '1921-03-17 11:30:00Z'],
  12. ['Ods', '2021-03-17 11:30:00Z'],
  13. ['Ods', '2041-03-17 11:30:00Z'],
  14. ['Xls', '1921-03-17 11:30:00Z'],
  15. ['Xls', '2021-03-17 11:30:00Z'],
  16. ['Xls', '2041-03-17 11:30:00Z'],
  17. ['Xlsx', '1921-03-17 11:30:00Z'],
  18. ['Xlsx', '2021-03-17 11:30:00Z'],
  19. ['Xlsx', '2041-03-17 11:30:00Z'],
  20. ];
  21. }
  22. /**
  23. * @dataProvider providerFormats
  24. */
  25. public function testSetCreated(string $format, string $timestamp): void
  26. {
  27. $spreadsheet = new Spreadsheet();
  28. $sheet = $spreadsheet->getActiveSheet();
  29. $sheet->getCell('A1')->setValue(1);
  30. $spreadsheet->getProperties()->setCreated($timestamp);
  31. $timestamp2 = preg_replace('/1-/', '2-', $timestamp);
  32. self::AssertNotEquals($timestamp, $timestamp2);
  33. $spreadsheet->getProperties()->setModified($timestamp2);
  34. $timestamp3 = preg_replace('/1-/', '3-', $timestamp);
  35. self::AssertNotEquals($timestamp, $timestamp3);
  36. self::AssertNotEquals($timestamp2, $timestamp3);
  37. $spreadsheet->getProperties()->setCustomProperty('cprop', $timestamp3, 'd');
  38. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
  39. $created = $reloadedSpreadsheet->getProperties()->getCreated();
  40. $dt1 = DateTime::createFromFormat('U', "$created");
  41. $modified = $reloadedSpreadsheet->getProperties()->getModified();
  42. $dt2 = DateTime::createFromFormat('U', "$modified");
  43. if ($dt1 === false || $dt2 === false) {
  44. self::fail('Invalid timestamp for created or modified');
  45. } else {
  46. self::assertSame($timestamp, $dt1->format('Y-m-d H:i:s') . 'Z');
  47. self::assertSame($timestamp2, $dt2->format('Y-m-d H:i:s') . 'Z');
  48. }
  49. if ($format === 'Xlsx' || $format === 'Ods') {
  50. // No custom property support in Xls
  51. $cprop = $reloadedSpreadsheet->getProperties()->getCustomPropertyValue('cprop');
  52. if (!is_numeric($cprop)) {
  53. self::fail('Cannot find custom property');
  54. } else {
  55. $dt3 = DateTime::createFromFormat('U', "$cprop");
  56. if ($dt3 === false) {
  57. self::fail('Invalid timestamp for custom property');
  58. } else {
  59. self::assertSame($timestamp3, $dt3->format('Y-m-d H:i:s') . 'Z');
  60. }
  61. }
  62. }
  63. }
  64. public function providerFormats2(): array
  65. {
  66. return [
  67. ['Ods'],
  68. ['Xls'],
  69. ['Xlsx'],
  70. ];
  71. }
  72. /**
  73. * @dataProvider providerFormats2
  74. */
  75. public function testConsistentTimeStamp(string $format): void
  76. {
  77. $pgmstart = (float) (new DateTime())->format('U');
  78. $spreadsheet = new Spreadsheet();
  79. $sheet = $spreadsheet->getActiveSheet();
  80. $sheet->getCell('A1')->setValue(1);
  81. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
  82. $pgmend = (float) (new DateTime())->format('U');
  83. self::assertLessThanOrEqual($pgmend, $pgmstart);
  84. $created = $reloadedSpreadsheet->getProperties()->getCreated();
  85. $modified = $reloadedSpreadsheet->getProperties()->getModified();
  86. self::assertLessThanOrEqual($pgmend, $created);
  87. self::assertLessThanOrEqual($pgmend, $modified);
  88. self::assertLessThanOrEqual($created, $pgmstart);
  89. self::assertLessThanOrEqual($modified, $pgmstart);
  90. }
  91. }