Я пытаюсь получить Date from excel с помощью PHPExcel. Но я не получаю дату, я получаю строковое значение, которое не является секундой с 1970 года.
Код, который я пробовал, – это
$InvDate=trim($excel->getActiveSheet()->getCell('B' . $i)->getValue());
Попробуйте использовать
$cell = $excel->getActiveSheet()->getCell('B' . $i); $InvDate= $cell->getValue(); if(PHPExcel_Shared_Date::isDateTime($cell)) { $InvDate = date($format, PHPExcel_Shared_Date::ExcelToPHP($InvDate)); }
PS
@DiegoDD: Следует указать, что формат $ – желаемый формат даты. например:
$InvDate = date($format = "Ymd", PHPExcel_Shared_Date::ExcelToPHP($InvDate));
Для даты getValue () должен возвращать float, который представляет собой значение временной метки Excel для этой даты / времени … Я подозреваю, что это ваш trim (), который переводит его в строку. Фактическое значение – количество дней с 1/1900 (или 1/1/1904 в зависимости от календаря, который используется в электронной таблице).
Вызов getFormattedValue () или getCalculatedValue () вместо getValue () должен возвращать дату, отформатированную как удобочитаемую строку в соответствии с маской номерной формы ячейки.
В качестве альтернативы, решение Сергея проверяет, имеет ли ячейка маска даты / времени и отображает соответствующий вспомогательный метод для преобразования этой временной метки Excel в временную метку unix, а затем использует стандартную функцию даты PHP для ее форматирования как читаемую человеком в соответствии со значением $ формат. Существует аналогичный вспомогательный метод PHPExcel_Shared_Date :: ExcelToPHPObject (), который преобразует сериализованную временную метку Excel в объект PHP DateTime
В новой версии библиотеки PhpOffice функция, которая обрабатывает это, – excelToDateTimeObject, поэтому новый формат кода должен быть:
$cell = $excel->getActiveSheet()->getCell('B' . $i); $InvDate= $cell->getValue(); if (PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) { $InvDate = PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($InvDate); }