Funciones PHP para fechas

El manejo de fechas es una tarea común en cualquier aplicación web. PHP ofrece potentes herramientas para trabajar con fechas, pero crear funciones personalizadas mejora la legibilidad y reutilización del código. A continuación, te presento funciones esenciales para obtener, validar y formatear fechas.

/**
  * Devolver la fecha de hoy con o sin hora
  */
  function dateToday($format = 'Y-m-d',$time = false){
    $date = new DateTime();
    return $time ? $date->format($format.' H:i:s') : $date->format($format);
  }

  /**
   * Validar la fecha
   */
  function dateValid($date,$format = 'd/m/Y'){
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
  }

  /**
   * Dar formato a la fecha
   */
  function dateFormat($date,$format = 'Y-m-d',$formatd = 'd/m/Y'){
    if(!empty($date)):
      $format = empty($format) ? 'Y-m-d': $format;
      $d      = DateTime::createFromFormat($format, $date);
      return $d->format($formatd);
    endif;
  }

  /**
   * Cambiar el format de la fecha para mysql
   */
  function dateFormatMysql($fecha,$time = false,$comillas = true){
    if(!empty($fecha)):
      if($time):
        $a    = explode(' ',$fecha);
        $b    = implode("-", array_reverse(explode("/", $a[0])));
        $date = $b.' '.$a[1];
      else:
        $date = implode("-", array_reverse(explode("/", $fecha)));
      endif;

      if($comillas)
        $date = "'".$date."'";

        return $date;
    else:
      return 'NULL';
    endif;
  }

  function dateFormatSql($fecha,$comillas = true,$null = true){

    if(!empty($fecha)):
      $fecha = str_replace('T',' ',$fecha);

      if($comillas)
        $fecha = "'".$fecha."'";

        return $fecha;
    else:
      return $null ? 'NULL' : '';
    endif;
  }

  /**
   * Saber el ultimo dia del mes
   */
  function lastDayMonth($fecha){
    $fecha = new DateTime($fecha);
    $fecha->modify('last day of this month');
    return $fecha->format('d');
  }

  /**
   * Saber dias entre 2 fechas
   */
  function dateDiff($fecha,$fecha2 = NULL,$format = '%a'){
    $f      = new Datetime($fecha);
    $f2     = new Datetime($fecha2);
    $intval = $f->diff($f2);
    return $intval->format($format);
  }

  /**
   * A partir del numero de semana saber las fechas
   * @param  int  $week_num [Numero de semana]
   * @param  int  $year     [Año de la semana]
   * @return array          [Devuelve las fechas de la semana]
   */
  function weekNumberToDate($week_num,$year = false){

    $year = $year ? $year : date('Y') ;

    $current_date = new DateTime();
    $current_date->setISODate($year,$week_num);

    $week_start = $current_date->format('Y-m-d');

    $current_date->setISODate($year,$week_num,7);
    $week_end = $current_date->format('Y-m-d');

    return weekDays($week_start,$week_end);
  }

  /**
   * Saber los dias entre 2 fechas
   * @param  string $date_start [Fecha incial]
   * @param  string $date_end   [Fecha final]
   * @return array              [Array con los dias entre las fechas]
   */
  function weekDays($date_start,$date_end){

    $date_start = new DateTime($date_start);
    $date_end = new DateTime($date_end);

    if($date_start < $date_end):
      $day_dif = ($date_start->diff($date_end))->format('%a');
      $dates = array($date_start->format('Y-m-d'));
      for ($i=0; $i <= $day_dif; $i++) {
        $dates[] = $date_start->modify("+ 1 day")->format('Y-m-d');
      }

      return $dates;
    else:
      return 'La fecha incial es superior a la fecha final';
    endif;
  }

  /**
   * Saber el dia de la semana ej: 1=Lunes, 7=Domingo
   */
  function dateKnowDay($fecha){
    $fechats = strtotime($fecha);
    return date('N', $fechats);
  }

  /**
   * Dia de la semana
   * @param optional $dia
   *
   * @return si se le pasa el parametro devuelve el dia, si no devuelve un array con todos los dias
   */
  function dayOfWeek($dia = false){
    $dias = array(1 => 'Lunes','Martes','Miércoles','Jueves','Viernes','Sábado','Domingo');
    if($dia)
      return $dias[(int) $dia];
    else
      return $dias;
  }

  /**
   * Mese/s del año
   * @param optional $mes
   *
   * @return si se le pasa el parametro devuelve el mes, si no devuelve un array con todos los meses
   */
  function monthsOfYear($mes = false){
    $meses = array(1 => 'Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre');
    if($mes)
      return $meses[(int) $mes];
    else
      return $meses;
  }

  /**
   * Diferencia entre años
   *
   * @param $y_start año desede
   * @param $y_end año hasta
   *
   * @return array años
   */
  function yearsDiff($y_start,$y_end){
    $years = array();
    if(is_numeric($y_start) && is_numeric($y_end)):
      if($y_start <= $y_end):
          for($i = $y_start; $i <= $y_end; $i++):
            $years[] = $i;
          endfor;
      endif;
    endif;
    return $years;
  }

  /**
   * Convertir hora a segundos
   *
   * @param string hora format H:i:s minimo hay que pasarle la hora
   */
  function convertirHoraSegundos($hora){
    $h    = explode(':',$hora);
    $hseg = $h[0]*3600;
    $mseg = isset($h[1]) ? $h[1]*60: 00 ;
    $seg  = isset($h[2]) ? $h[2]:    00 ;
    return $hseg + $mseg + $seg;
  }

  /**
   * Pasar de segundos a H:i:s
   */
  function convertirSegundosHora($segundos) {
    $horas   = floor($segundos/3600);
    $minutos = str_pad(floor(($segundos-($horas*3600))/60),2,0,STR_PAD_LEFT);
    $segundo = str_pad($segundos-($horas*3600)-($minutos*60),2,0,STR_PAD_LEFT);
    return $horas.':'.$minutos.':'.$segundo;
  }

  /**
   * Pasar de segundos a D:H:i:s
   */
  function segundosToDHMS($segs){
    $cadena = '';
    if($segs >= 86400) {
      $dias   = floor($segs/86400);
      $segs   = $segs%86400;
      $cadena = $dias.' día';

      if($dias != 1) $cadena .= 's';
      if($segs >= 0) $cadena .= ', ';
    }
    if($segs >= 3600){
      $horas   = floor($segs/3600);
      $segs    = $segs%3600;
      $cadena .= $horas.' hora';

      if($horas != 1) $cadena .= 's';
      if($segs >= 0) $cadena .= ', ';
    }
    if($segs >= 60){
      $minutes = floor($segs/60);
      $segs    = $segs%60;
      $cadena .= $minutes.' minuto';

      if($minutes != 1) $cadena .= 's';
      if($segs >= 0) $cadena .= ', ';
    }

    $cadena .= $segs.' segundo';
    if($segs != 1) $cadena .= 's';

    return $cadena;
  }
Lenguaje del código: PHP (php)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Captcha cargando...

Scroll al inicio