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

Вот что у меня в таблице:

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

это мой код, который я использую для извлечения даты и преобразования строки даты в 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, или я пропустил настройку или что-то еще, что мне нужно сделать, прежде чем извлекать дату из ячейки. Возможно проблема с часовым поясом?

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


person bumperbox    schedule 14.04.2011    source источник


Ответы (2)


Я не уверен в этом, но...

Функция 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 день.

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

person Wh1T3h4Ck5    schedule 14.04.2011
comment
использование gmdate() имеет значение, но не устраняет проблему. - person bumperbox; 14.04.2011
comment
я сохранил тот же файл как файл xlsx и импортировал его (и использовал gmdate), и это сработало. так может дело в формате файла? - person bumperbox; 14.04.2011
comment
@ Wh1T3h4Ck5 - Если бы люди сообщали мне об ошибках, я мог бы их исправить ... в основном все, что я слышу, это то, что это не работает. Но вы правы, PHPExcel рассматривает все сериалы дат Excel как временную метку UTC. Я не знаю ни одного значения в формате .xls BIFF, которое в противном случае идентифицировало бы смещение часового пояса (только переключатель календаря Windows 1900/Mac 1904), в то время как последующее использование функции date() для преобразования возвращаемого значения метки времени unix к формату отображения будет соответствовать часовому поясу по умолчанию. - person Mark Baker; 14.04.2011
comment
Я не уверен, что я мог бы сделать в противном случае, преобразование даты в Excel в местное время приведет к целому ряду проблем и осложнений, так что это не совсем практичный вариант. PS. Я был очарован вашим вопросом о разнице в скорости date() с установленным часовым поясом и без него. - person Mark Baker; 14.04.2011
comment
@ Wh1T3h4Ck5 - да! извините за незначительную тираду. Я собираюсь весело провести время, пытаясь изолировать первоначальную проблему бампербокса... потому что, если PHPExcel произвольно меняет порядковый номер даты при чтении файла xls, тогда он может произвольно изменить любое число с плавающей запятой (не только порядковый номер даты)... и это будет критический сбой - person Mark Baker; 14.04.2011
comment
@markbarker Я подозреваю исходный файл xls, другие файлы, которые я загружаю, отлично работали с тем же кодом. если бы это была ошибка, которую я мог бы воспроизвести последовательно, я бы подал отчет. но предоставление вам чего-то, что не может быть воспроизведено последовательно, никому не поможет - person bumperbox; 14.04.2011

Определять

date_default_timezone_set(YOUR_TIME_ZONE);

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

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

to:

 PHPExcel_Style_NumberFormat::toFormattedString($txn_date_xls, 'Y-m-d H:i:s')
person Diego Olivera    schedule 30.01.2015