Convertir fechas de excel a PHP

phpexcel_logo Un archivo de Microsoft Excel almacena las fechas en un formato numérico que corresponde a los días desde el 1 de enero de 1900, teniendo en cuenta que php las fechas las guarda a partir de 1970 y en segundos pues es un poco engorroso convertir una fecha de un formato a otro, para ello PHPExcel de codeplex tiene una clase llamada PHPExcel_Shared_Date con una función estática que hace esta operación, la función como tal se llama ExcelToPHP y devuelve la cantidad de segundos correspondientes a la fecha en PHP.

Podemos utilizarla de la siguiente forma:

// leo el archivo excel
$objPHPExcel = HPExcel_IOFactory::load('prueba.xlsx');
// utilizo como activa la hoja 1
$objPHPExcel->setActiveSheetIndex(0);
$objWorksheet = $objPHPExcel->getActiveSheet();
// obtengo el valor de la celda
$fecha_excel = objWorksheet->getCell('A1')->getValue();
// utilizo la función y obtengo el timestamp
$timestamp = PHPExcel_Shared_Date::ExcelToPHP($fecha);
$fecha_php = date("Y-m-d H:i:s",$timestamp);

Comentarios

Anónimo ha dicho que…
Perfecto!! Esto es justo lo que necesitaba Muchas Gracias, ya estaba loco haciendo pruebas con el timestamp de getdate y date tratando de hacer la conversión manualmente y todo lo habia calculado perfectamente pero siempre me jodían los años bisiestos jajaja
Dan ha dicho que…
Excelente ayuda, pero he intentado con varias fechas: 04/01/2011, 10/10/2011 etc..
y siempre tengo que sumale un dia sino me muestra el dia anterior indicado en el excel:

$timestamp = PHPExcel_Shared_Date::ExcelToPHP($val);
$timestamp = strtotime("+1 day",$timestamp);
$fecha = date("d/m/Y", $timestamp);

en mi excel dice: 04/10/2011 y con el ejemplo que pones sale: 03/10/2011.


Gracias por tu ayuda.
Gracias Dan, curioso lo que te pasa, imagino que sea por diferencias entre las versiones de PHP Excel y también el formato de la celda, al final lo importante es que has encontrado como sacarla correctamente, gracias por tu aporte
Zaki ha dicho que…
Gracias, excelente explicación.
Resumido también puede ser:

$mifecha = date("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP( $worksheet->getCellByColumnAndRow(5, $row)->getValue() + 1 ) );

Saludos :D
Anónimo ha dicho que…
Gracias..
Anónimo ha dicho que…
Excelente aporte.

Atte Vic
Anónimo ha dicho que…
Gracias por el aporte.

Me ha venido genial pues usaba la librería para escribir en EXCELS y estaba buscando algún script para transformar los números cuando la librería lo soluciona sin problemas.
Luis Castro ha dicho que…
amigo. te resta un día porque la fecha en el excel viene como un número por ejemplo 41359 para la fecha 26-03-2013. Entonces el PHP recibe 41359 y la convierte en 26-03-2013 00:00:00 osea a las 12 de la noche del día solicitado. Peeeero le resta la diferencia GMT de tu pais. En mi caso en Chile (GMT-4) convierte la fecha en 25-03-2013 20:00:00. Por ahora lo estoy solucionando sumandole 5 horas y así llego a la fecha correcta con seguridad.
saludos
Reynier de la Rosa ha dicho que…
Gracias Luis, la verdad que depende mucho de la configuración de hora que tengas en tu máquina, en PHP y en la que se haya creado el excel que por defecto creo que cree siempre que es GMT.

La solución es como has hecho tu, adaptarlo y restarle o sumarle la diferencia horaria con GMT, en mi caso suelen ser 1 o 2 horas dependiendo del horario de verano o no.

Saludos
Anónimo ha dicho que…
Hola,

Creo que hay un pequeño fallo en el código...donde dice:

// utilizo la función y obtengo el timestamp
$timestamp = PHPExcel_Shared_Date::ExcelToPHP($fecha);

Creo que deberia ser:

// utilizo la función y obtengo el timestamp
$timestamp = PHPExcel_Shared_Date::ExcelToPHP($fecha_excel);

***Por lo menos a mi si me ha funcionado así, de la otra manera me salia un valor erróneo**

Saludos,
Anónimo ha dicho que…
Para no aumentar o disminuir segun la zona horaria se tendría que utilizar gmdate(), quedando:

$fecha = gmdate("d/m/Y", $timestamp);
Reynier de la Rosa ha dicho que…
Gracias no me sabía esa función.
Anónimo ha dicho que…
MIL GRACIAS !!!!!!!!!!!!!
Anónimo ha dicho que…
Que bueno con gmdate, se soluciona el problema de la diferencia horaria, Gracias!!!
Anónimo ha dicho que…
Excelente, muchas gracias, saludos desde Villavicencio, Meta, Colombia