#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')