Su partner en Internet

Los secretos ocultos de strtotime() en PHP

strtotime PHP

Todo el mundo tiene presente la función date() de PHP que con la cantidad de modificadores que tiene para los parámetros de formato da mucho de si!

Pero es que combinado con las cadenas de caracteres que podemos ir poniendo a la función strtotime, entonces ya es que casi puedes hacer todo.

Es relativamente fácila saber el dia de la semana que corresponde la fecha de hoy: date(«w») o bien en que semana del año esta la fecha de hoy: date(«W») y otros modificadores que tenéis en date() pero los de strtotime() también dan mucho juego!

Me pasó que debía buscar el dia exacto correspondiente al año anterior de una fecha dada. Pero considero como exacto el día que correspondió a la semana #n y dia #d. Por ejemplo el dia de la fecha de publicación de este post fue el 15/5/2015 que corresponde a la semana 20 del año 2015 y como es viernes pues la pregunta es: qué dia era el viernes de la semana 20 del año 2014? pues fue el 16/5/2014 y cómo puedo resolver en un algoritmo esto? Yo hice esto:

$fecha = date("Y-m-d");

$dia_semana = date("w",strtotime($fecha)); //Sabemos el numero ordinal de dia en una semana
$semana = date("W",strtotime($fecha)); //Sabemos en que semana nos encontramos del año.
$any_anterior=date("Y",strtotime($fecha." -1 year")); //Sabemos el año anterior 
$la_fecha=date("Y-m-d",strtotime($any_anterior."-W".$semana.'-'.$dia_semana));

Os explico: siendo $fecha la fecha de hoy…(2015-5-15) Tiro de fecha standar mySQl espero que no os importe 🙂

  1. Calculo el dia de la semana en la primera variable (5)
  2. Calculo en qué semana estamos del año. (20)
  3. Muy fácil saber el año anterior a la fecha de hoy! (2014). Fijaros que ya el strtotime se le puede añadir un literal com «-1 year» por lo que podéis deducir que se usa para +/- year, month, day si quisieráis saber dias, meses o años antes (con el signo «-«) o después (con el signo «+»)
  4. Pero la verdadera maravilla, que lo encontré en un lugar profundo del manual de php y como ejemplo dentro de strtotime() fue la linea posterior fijaros como se monta una fecha poniendo «-W» entendiendo que no ha de poner el mes en curso sino el mes que corresponde a la semana 20 del año anterior! y continua poniendo el día corriente correspondiente al día de la semana indicado. de formas literal pues seria un date(«Y-m-d»,strtotime(‘2014-W20-5″)). Veréis que la fecha es 2014-5-16

Siempre busco antes en foros españoles de php todo esto, pero la verdad este supuesto no lo he necesitado hasta ahora y cuando lo necesito me ha costado encontrarlo. Pues bien espero que si alguien lo necesita no le cueste tanto encontrarlo (señal que está aquí :-))

 

Etiquetas: , , , ,

Entradas relacionadas

4 comentarios

  • saludos muy buena información se que el post no es nuevo pero me gustaría saber si me puedes ayudar estoy tratando de hacer una función que me permita sumar los días dada una fecha pero que no me cuente los fines de semana. exacta ahora he conseguido que me sume los días y me los muestre tal como quiero es decir que me sume los días pero cada 5 años me sume 3 días, hasta allí todo bien funciona bien me dice cuantos días le corresponde y los años que tiene, pero ahora me piden que no sean días continuos sino días hábiles y por cada año desde la fecha de ingreso me sume un día mas y hay si me pare estoy tratando de resolver pero no doy no se si me pueden orientar, coloco el código como lo llevo.

    $fechaIngreso =’2016-02-01′;
    $fechaSalidaVacaciones =’2018-10-01′;

    $fechasalida = date(«d/m/Y», strtotime($fechaSalidaVacaciones));

    $fechaIngresoObj = new DateTime($fechaIngreso);
    $fechaSalidaVacacionesObJ = new DateTime($fechaSalidaVacaciones);
    $intervalo = $fechaIngresoObj->diff($fechaSalidaVacacionesObJ);

    $anosEnLaInstitucion=$intervalo->y;

    if ($anosEnLaInstitucion5) and ($anosEnLaInstitucion=10) and ($anosEnLaInstitucion=15) and ($anosEnLaInstitucion 20) {
    $fechaEsperada = strtotime($fechaSalidaVacaciones.»+ 42 days»);
    $fecha= date(«d/m/Y»,$fechaEsperada);
    }
    ?>

    <?php
    if ($anosEnLaInstitucion5) and ($anosEnLaInstitucion=10) and ($anosEnLaInstitucion=15) and ($anosEnLaInstitucion 20) {
    $dias =’42’;
    }
    ?>

    Echo ‘Le Corresponden ‘.$dias.’ Dias’;
    Echo »;
    Echo ‘Debe Regresar el ‘.$fecha;

  • ¡¡Gracias mil por la información compartida en tu artículo!!

    Me acaba de ser SUPER ÚTIL.

    Levaba rato probando combinaciones para dada una semana y un año, obtener todos los días siguientes, de lunes a viernes, en formato fecha Y-m-d, pero no acababa de cuadrarme, y con tu post me ha quedado clarísima la llamada al strtotime que tenía que realizar para obtener lo que necesitaba.

    ¡¡Gracias!!

  • Buenos días,
    Ante todo, gracias pro la aportación. Utilice este script para saber la fecha del dia equivalente del año anterior, pero he visto que falla cuando el primer día es domingo, ya que el día de la semana se calcula con «w» y en este caso el domingo es el primer dia d ela semana, y la semana se calcula con «W» y en este caso el primer día de la semana es el Lunes, por tanto cuando estamos es domingo el día equivalente que calcula tiene una semana de retraso.
    Estoy intentando encontrar una solución, si la tengo le aviso.

  • Hola,
    Ya esta resuelto, he añadido la siguiente validación justo antes del calculo de la variable $la_fecha, y ya funciona perfectamente:
    if($dia_semana == 0){
    $semana += 1;
    }
    Espero haber ayudado, y si hay alguna solución mas sencilla o completa agradeceria el comnetario para mejorar mi codigo.
    Saludos

Deja un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada.




Top