PhpSpreadsheet формирует дату импорта из XLSX

Добрый день. Я использую библиотеку 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)

Мой ответ неверен?

Andreas 16.05.2018 21:31

Можете мне ответить? В моем ответе чего-то не хватает или ваша проблема решена?

Andreas 18.05.2018 05:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
5 669
2

Ответы 2

В 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)

https://3v4l.org/mMZQ4

Эта формула почти работает, но кажется, что сейчас один выходной. При этом использование функций, предоставляемых 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));

Dave 03.07.2019 16:21

@ Дэйв, как я написал в ответе, «помни о часовом поясе». Unix - часовой пояс 0, а США - отрицательная шкала. Поскольку ваше значение Excel ничего не знает о часовых поясах, оно возвращает значение как есть. Но PHP знает часовой пояс и возвращает время в вашем часовом поясе, поскольку входное значение находится в GMT. Так что добавьте количество часов, которое вы находитесь после GMT, в строку кода, и все должно работать нормально.

Andreas 03.07.2019 17:17

Спасибо, Андреас, это подтолкнуло меня в правильном направлении.

Dave 03.07.2019 17:56

Для полноты картины вот что сработало (обратите внимание на использование встроенной функции PHPSpreadsheet для преобразования даты ... 14400 на 4 часа отстает от времени по Гринвичу, чем сейчас восточная часть США) echo date('Y-m-d h:i',(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestam‌​p(43559) + 14400));

Dave 03.07.2019 20:09

Другой способ решить эту проблему - получить активный лист из нашего объекта PHPSpreadSheet и изменить стиль следующим образом:

$sheet = $PhpSpreadSheetObject->getActiveSheet();
$sheet->getStyle("A1:Z1")->getNumberFormat()->setFormatCode("YYYY-MM-DD");

Другие вопросы по теме