Добрый день. Я использую библиотеку PhpSpreadsheet для импорта xlsx.
В столбце I в xlsx у меня есть это значение 20/10/1970 00:00:00, отображаемое как 1970-10-20 00:00:00, но когда я его импортирую:
$dataArray = $spreadsheet->getActiveSheet()
->rangeToArray(
'A2:AO3', // The worksheet range that we want to retrieve
NULL, // Value that should be returned for empty cells
NULL, // Should formulas be calculated (the equivalent of getCalculatedValue() for each cell)
TRUE, // Should values be formatted (the equivalent of getFormattedValue() for each cell)
TRUE // Should the array be indexed by cell row and cell column
);
Я получаю странный ["I"] => float(25861). Помогите мне получить данные об углероде в этом поле.
Если я попытаюсь преобразовать это число с плавающей точкой как метку времени, я получу 01/01/1970, а не 10/20/1970.
В другую дату я получаю как ["J"] => float(43195.4092014)
Можете мне ответить? В моем ответе чего-то не хватает или ваша проблема решена?






В Excel даты не такие, как в других программах / языках программирования.
Excel считает с 1900-01-01, в отличие от UNIX, который считает с 1970-01-01.
Возвращаемое число - это значение с плавающей запятой, равное количеству дней с 1900-01-01, а доля от числа с плавающей запятой - это время дня.
Например, 25861.5 - это 1970-10-20 12:00 ("Y-m-d h.i").
Чтобы преобразовать в UNIX, вы должны взять возвращаемое значение - 25569 (1970-01-01 в Excel) и умножить на 86400 (один день в секундах).
Глянь сюда: https://3v4l.org/AudMn
В Excel, если вы отформатируете 25861 и 25569 как даты: 
Другой поплавок у вас 43195.4092013889
echo date("Y-m-d h:i", (43195.4092013889-25569)*86400); //2018-04-05 11:49 (mind the timezones)
Эта формула почти работает, но кажется, что сейчас один выходной. При этом использование функций, предоставляемых PHPSpreadSheet, также является выходным. Мое необработанное значение - 43559, и по вашей формуле оно получается как 2019-04-03, но в ячейке электронной таблицы отображается 04.04.2019 (это в США). Используя функции, PHPSpreadSheet удивил, он также показывает 2019-04-03, что неверно. echo date('Y-m-d h:i',\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(43559));
@ Дэйв, как я написал в ответе, «помни о часовом поясе». Unix - часовой пояс 0, а США - отрицательная шкала. Поскольку ваше значение Excel ничего не знает о часовых поясах, оно возвращает значение как есть. Но PHP знает часовой пояс и возвращает время в вашем часовом поясе, поскольку входное значение находится в GMT. Так что добавьте количество часов, которое вы находитесь после GMT, в строку кода, и все должно работать нормально.
Спасибо, Андреас, это подтолкнуло меня в правильном направлении.
Для полноты картины вот что сработало (обратите внимание на использование встроенной функции PHPSpreadsheet для преобразования даты ... 14400 на 4 часа отстает от времени по Гринвичу, чем сейчас восточная часть США) echo date('Y-m-d h:i',(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(43559) + 14400));
Другой способ решить эту проблему - получить активный лист из нашего объекта PHPSpreadSheet и изменить стиль следующим образом:
$sheet = $PhpSpreadSheetObject->getActiveSheet();
$sheet->getStyle("A1:Z1")->getNumberFormat()->setFormatCode("YYYY-MM-DD");
Мой ответ неверен?