Phpspreadsheet - ячейка времени, полученная как float

У меня есть файл Excel с вводом времени.

  Mar 01, 2018  | Thursday  | 8:00 AM | 5:00 PM
  Mar 02, 2018  | Friday    | 8:00 AM | 5:00 PM

Но когда мой код пытается прочитать эти ячейки, вывод становится плавающим (например, 8:00 AM становится 0.33333333333333). Это мой код

$date = $sheet->getCell("A".$row)->getValue();
$time_in = $sheet->getCell("C".$row)->getValue();
$time_out = $sheet->getCell("D".$row)->getValue();

echo "date: ".$date.          //Mar 01, 2018
     " time_in: ".$time_in.   //becomes 0.333333333333333
     " time_out: ".$time_out; //becomes 0.708333333333333

Как я могу сделать вывод как есть без изменения значения phpspreadsheet? Я попытался посмотреть документацию phpspreadsheet, но не нашел решения.


person Red Magda    schedule 07.03.2018    source источник


Ответы (2)


К счастью, я только что нашел ответ.

$in = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($time_in);
echo gmdate("g:i a", $in);

Надеюсь, это может быть полезно для других.

person Red Magda    schedule 07.03.2018
comment
Я предлагаю использовать gmdate (g: i a, $ in) вместо даты, чтобы это не был выходной. Например, если ваша система настроена на EST, дата преобразует дату / время с использованием -5. ex 19 апреля 2019 г. станет 1:00 18 апреля 2019 г. - person Johnish; 20.06.2019

Сформируйте данные, прежде чем читать их.

Например:

данные ячейки 2020/10/13 19:00:00

Доступ напрямую получит 44117.791666667

$sheet->toArray();

Форматировать перед доступом получит 2020-10-13 19:00:00

$row_num = $sheet->getHighestDataRow();
$sheet->getStyle("H1:H$row_num")->applyFromArray(array("numberFormat"=>array("formatCode"=>'yyyy-mm-dd hh:mm:ss'))); // H is the datatime row
$sheet->toArray();
person LF00    schedule 12.10.2020