10

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.

10 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

  5. Como puedo hacer que la fecha me salga en Español???

  6. Muchas Gracias!!! 😀

  7. Hola amigo tengo un pequeño problema y me gustaría que me ayudaras, estoy haciendo un calendario de fechas para reserva en donde debo consultar a la base de datos por un rango de fechas a ver si esas fechas están o no disponibles solo tengo que consultar días, mes y año. la fecha que inicio y fin que introduce el usuario en el datepicker es en formato dd/mm/aa y en mi bd mysql es tipo date. No he logrado dar con una consulta que me funcione, te agradecería de ante mano tu ayuda. Gracias

  8. Gracias por la aportación, tenía precisamente ese problema.

    Aunque tuve que ajustar mi zona horaria usando:

    1
    
    date_default_timezone_set("America/Los_Angeles")

    en mi caso es la zona horaria que requería.

    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.