5

Strtotime y las fechas en PHP

Ayer comentábamos cómo hacer un datePicker en jQuery y no dijimos nada sobre cómo tratar esas fechas para insertarlas en una base de datos.

La función strtotime devuelve un timestamp, y toma como parámetro una fecha en un determinado formato. En esta entrada vamos a ver qué formatos de fecha podemos pasarle a strtotime.

Recordad, las fechas que se mostrarán en el input del datePicker que vimos ayer, dependerá de cómo hayamos configurado date.js en la línea:

Date.format = 'dd/mm/yyyy';

Este formato de fecha que hemos elegido no nos servirá a la hora de hacer un timestamp con strtotime, ya que el formato dd/mm/yyyy no es reconocido por esa función, como podemos ver en este comentario. Algunos formatos reconocidos son:

  • mm/dd/yyyy
  • mm/dd/yy
  • yyyy/mm/dd
  • dd-mm-yyyy
  • yy-mm-dd
  • yyyy-mm-dd

Así que, por ejemplo, si la fecha es 1 de Febrero de 2009 (que se nos mostraría como 01/02/2009), al pasarlo por strtotime nos devolverá el timestamp del 2 de Enero de 2009, es decir, pensará que le estamos pasando una fecha en formato mm/dd/yyyy.

Para solucionar esto, podemos cambiar las barras por guiones antes de aplicarle la función strtotime. Por ejemplo:

<?php
$fecha_esp = str_replace("/", "-", $fecha_ing);
$timestamp = strtotime($fecha_esp);
?>

En este caso, al pasarle a strtotime la fecha en formato dd-mm-yyyy sí nos devolverá el timestamp correcto.

Otra solución es cambiar en date.js el formato de las fechas, poniendo simplemente “dd-mm-yyyy”. En este caso, las fechas se mostrarán en el input en el formato dd-mm-yyyy, y se lo podemos pasar tal cual a la función strtotime.

5 comentarios

  1. Muchas gracias me solucionaste el problema. espero que sigas aportando con la humanidad… jeje Gracias

  2. Opino igual que Yerson, a mi me solucionaste un marrón XDD

    Gracias, sigue así.
    ;)

  3. LUIS PUMARICRA DIAZ

    Hola gracias por tu codigo, este es mi caso:
    $fechaInicio = strtotime(“01-03-2011″);
    $fechaFin = strtotime(“31-03-2011″);
    for($i=$fechaInicio; $i<=$fechaFin; $i+=86400){
    echo date("d-m-Y", $i)."”;
    }
    —-
    si ejecuto eso, se genera el bucle y me sale:
    01-03-2011 hasta el 30-03-2011

    pero MARZO del 2011 no tiene 31 DIAS…?
    please ayudame… que debo de cambiar o agregar en el codigo..?

    • Hola Luis. Has dado con uno de los mayores quebraderos de cabeza a la hora de tratar las fechas. Si al mostrar la fecha pones que también te muestre la hora, verás que entre el 27 y el 28 de marzo ha aparecido de la nada 1 hora más.

      1
      2
      
      27-03-2011 00:00:00
      28-03-2011 01:00:00

      ¿De dónde ha salido esa hora? Eso pasa porque se aplica el cambio horario. En octubre volverás a recuperar esa hora. Entre el día 27 y 28 de marzo no hay 86400 segundos, sino sólo 82800. El día 31 no te sale porque 31-03-2011 01:00:00 es mayor que 31-03-2011 00:00:00, que es tu condición de salida del bucle.

      Para evitarlo, te recomiendo usar “+1 day” en strtotime para calcular el incremento del bucle. Yo lo dejaría así:

      1
      2
      3
      4
      5
      
      $fechaInicio = strtotime("01-03-2011");
      $fechaFin = strtotime("31-03-2011");
      for($i=$fechaInicio; $i<=$fechaFin; $i=strtotime("+1 day",$i)){
          echo date("d-m-Y", $i)."";
      }

      Simplemente he cambiado el incremento del bucle, dejando a strtotime que se encargue de sumar “1 día”, ya sea de 86400 segundos, de 82800, o de 90000 (en octubre).

      También podrías usar “+1 week” o “next Monday”, por ejemplo. Aquí tienes más información:
      http://php.net/manual/en/function.strtotime.php

  4. justo lo que buscaba, master q buen tip :) probe con la funcion date_format pero no me resulto.

    Saludos

Comentar

*

*

Para añadir código formateado, escribe el código entre <pre lang="php" line="1"> y </pre>

Si quieres un avatar personalizado, créate uno en gravatar.com con tu dirección de correo. Cada vez que comentes con ese correo, aparecerá tu avatar personalizado.