Convertir fechas de excel a PHP

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
Unknown 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.
Reynier ha dicho que…
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 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 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
Carlox ha dicho que…
Gracias de verdad majo!!!, a fecha de hoy... me has ahorrado un buen tiempo de scripts en algo que es complementario a mi desarrollo, ya andaba buscando como sumar y restar los dias transcurridos con fecha UNIX y cosas así... vale una vez más muy agradecido!
Reynier ha dicho que…
Un placer, me alegro de servir de ayuda
aragones ha dicho que…
Gracias a todos, hice esto, puede que con una función, no le volvamos a ver.
date("Y-m-d", strtotime("+1 day", PHPExcel_Shared_Date::ExcelToPHP($Fecha)));
Donde $Fecha es la fecha desde excel, le llame FIEXCEL, gracias de veras.
Anónimo ha dicho que…
muy buenos aportes muchas gracias me ha servido e incluso hasta los comentarios gracias!!
Anónimo ha dicho que…
Excelente aporte, alguien sabe como hacer lo mismo para los campos time?, ya que también vienen en un formato numérico desde el excel
Unknown ha dicho que…
Hola,

Y si tienes fechas vacías en el campo fecha? Que sean NULL
$fecha = date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($fecha));
CAST('$fecha' AS DATE),

Como lo pones?
Reynier ha dicho que…
Tratar la variable primero, y si es null u otro valor no deseado no llamar a la función.
TaylorAsprilla ha dicho que…
Muchas gracias por esta función. No la conocía y me ha sido de mucha ayuda. Muchas gracias!
Anónimo ha dicho que…
gracias me ha funcionado super bien....
Bruthus ha dicho que…
lo que deberías hacer es sumar 36161 al timestamp que te devuelve PHPExcel_Shared_Date::ExcelToPHP($fecha), que son los segundos de ajuste entre la fecha=0 de MS Excel (1900-01-01) y la fecha=0 de PHP (1970-01-01).
fredyluishc.blogspot.com ha dicho que…
Con gmDate y listo