Поле даты PHPExcel не соответствует исходной электронной таблице

#php #phpexcel

#php #phpexcel

Вопрос:

Это то, что находится в моей электронной таблице:

 12/04/2011  8:56:17 p.m. (xls dateserial = 40645.87242)
  

это мой код, который я использую для извлечения даты и преобразования в строку date в PHP:

 $txn_date_xls = $sheet->getCell("H$row")->getValue();               
echo "Txn Date (original): $txn_date_xls<br />";

$txn_date = PHPExcel_Shared_Date::ExcelToPHP($txn_date_xls);
echo "Txn Date: ".date('Y-m-d H:i:s', $txn_date)."<br />";
  

Это результат моего скрипта:

 Txn Date (original): 40644.55783637732
Txn Date: 2011-04-11 13:23:17
  

Серийный номер даты не соответствует исходной электронной таблице.
Итак, я пытаюсь определить, является ли это ошибкой PHPExcel, или я пропустил настройку или что-то еще, что мне нужно сделать, прежде чем извлекать dateserial из ячейки. Возможно, проблема с часовым поясом?

Извините, я еще не очень хорошо знаком с библиотекой PHPExcel.

Ответ №1:

Я не так уверен в этом, но…

Функция date() в PHP зависит от настройки часового пояса сервера.

PHPExcel_Shared_Date::ExcelToPHP() предполагает, что указанная дата является GMT, и соответственно возвращает время Unix.

Поэтому попробуйте установить GMT / UTC для часового пояса PHP в начале скрипта (используя date_default_timezone_set())

 date_default_timezone_set('UTC');
  

или как это (используя ini_set())

 ini_set('date.timezone', 'UTC');
  

Кроме того, попробуйте использовать gmdate() вместо date(), в противном случае вы можете получить смещение на 1 день.

Полезная ссылка:

Комментарии:

1. использование gmdate() действительно меняет ситуацию, но не устраняет проблему.

2. я сохранил тот же файл, что и файл xlsx, и импортировал его (и использовал gmdate), и это сработало. так что, возможно, это связано с форматом файла?

3. @Wh1T3h4Ck5 — Если бы люди сообщили мне об ошибках, то я мог бы их исправить … в основном все, что я слышу, это «это не работает». Но вы правы, PHPExcel обрабатывает все dateserials Excel как временную метку UTC. Мне неизвестно ни о каком значении в формате .xls BIFF, которое в противном случае определяло бы смещение часового пояса (только переключатель календаря Windows 1900 / Mac 1904), в то время как последующее использование функции date() для преобразования возвращаемого значения метки времени unix в формат отображения будет соответствовать часовому поясу по умолчанию.

4. Я не уверен, что я мог бы сделать иначе, преобразование dateserial Excel в местное время привело бы к множеству проблем и осложнений, так что это не совсем практичный вариант. PS. Я был очарован вашим вопросом о разнице в скорости date() с установленным часовым поясом и без него.

5. @Wh1T3h4Ck5 — да! извините за незначительную тираду. Я собираюсь повеселиться, пытаясь изолировать исходную проблему bumperbox … потому что, если PHPExcel произвольно изменяет dateserial при чтении xls-файла, тогда он может произвольно изменить любой float (не только dateserials)… и это было бы критически важным сбоем

Ответ №2:

Определить

 date_default_timezone_set(YOUR_TIME_ZONE);
  

Измените эту строку:

 date('Y-m-d H:i:s', $txn_date)
  

Для:

  PHPExcel_Style_NumberFormat::toFormattedString($txn_date_xls, 'Y-m-d H:i:s')