如何使用PHPSReadSheet从表格单元格中检索日期?

如何使用PHPSReadSheet从表格单元格中检索日期?,php,phpspreadsheet,Php,Phpspreadsheet,我有xlsx表,我使用PhpSpreadsheet来解析它们。有些单元格的格式是日期。问题在于PhpSpreadsheet以未指定的格式从日期格式的单元格返回值: // How it looks in excel: 2017.04.08 0:00 $value = $worksheet->getCell('A1')->getValue(); // 42833 - doesn't look like a UNIX time 如何以UNIX时间或DateTimeInterface实例

我有
xlsx
表,我使用PhpSpreadsheet来解析它们。有些单元格的格式是日期。问题在于PhpSpreadsheet以未指定的格式从日期格式的单元格返回值:

// How it looks in excel: 2017.04.08 0:00
$value = $worksheet->getCell('A1')->getValue();  // 42833 - doesn't look like a UNIX time

如何以UNIX时间或
DateTimeInterface
实例的形式从单元格中获取日期?

该值是自1900年以来经过的天数。您可以使用PHPSReadSheet内置函数将其转换为unix时间戳:

$value = $worksheet->getCell('A1')->getValue();
$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($value);
或到PHP
DateTime
对象:

$value = $worksheet->getCell('A1')->getValue();
$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);

当我们使用
$row->getCellIterator()
进行迭代时,或者我们可能有其他类型的值,使用它可能会很有用

使用
getValue()时

  • 全名:Jane Doe=>“Jane Doe”
  • 出生日期:11/18/2000=>36848.0
使用
getFormattedValue()时

  • 全名:Jane Doe=>“Jane Doe”
  • DOB:11/18/2000=>“11/18/2000”

    • 因为我不能添加评论,只能为未来用户添加答案。您可以使用以下代码(来自已接受的答案)将excel时间戳转换为unix时间戳


      您可以使用
      \PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)
      函数确定给定的单元格是否为日期时间。

      对于那些因阅读日期而丢失的人,我希望我的答案能够完成。我对包含日期的列也有问题。 当我在Excel中读取时,所有日期的格式都是d/m/Y,但使用PhpOffice\PhpSpreadsheet,一些行被读取为d/m/Y,其他行被读取为m/d/Y。 我是这样做的:

      首先,我用->getDataType()检查格式

      我的默认格式是m/d/Y,但当->getDataType()返回“s”时,它将变为d/m/Y

      $cellDataType = $objSheetData->getCell("D".$i)->getDataType();
      $cellFormat = 'm/d/Y';
      if ($cellDataType=='s'){
          $cellFormat = 'd/m/Y';
      }
      $resultDate=\DateTime::createFromFormat($cellFormat, $sheetData[$i]['D']);
      

      如果我通过
      $row->getCellIterator()
      迭代单元格,你是否知道如何确定该单元格的值是否应该是日期(然后正确调用
      excelToTimestamp
      )?@AndreasWong,这是一个单独问题的主题。如果您已经问过这个问题,请给我一个链接。确保将其设置为false$reader->setReadDataOnly(false);否则getformattedvalue()函数不会做任何更改谢谢@jeandavyNizigama没有您的评论,答案是没有用的。
      $cellDataType = $objSheetData->getCell("D".$i)->getDataType();
      $cellFormat = 'm/d/Y';
      if ($cellDataType=='s'){
          $cellFormat = 'd/m/Y';
      }
      $resultDate=\DateTime::createFromFormat($cellFormat, $sheetData[$i]['D']);