Helper Date.
Funciones de manipulación de fechas

Code Helper

Helpers – Date – Fechas

Librería para la manipulación de fechas en formato yyyy-mm-dd.

/**
 * HelperDate.php
 * @author      Code Develium
 */


namespace Helpers;

use DateTime;

/**
 * Class HelperDate
 */
abstract class HelpDate
{

    /**
     * Devuelve el numero de días entre dos fechas.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param $fecha1
     * @param $fecha2
     *
     * @return int
     */
    public static function getDifDays($fecha1, $fecha2)
    {
        list($anio1, $mes1, $dia1) = explode('-', $fecha1);
        list($anio2, $mes2, $dia2) = explode('-', $fecha2);

        /* calculo timestam de las dos fechas */
        $timestamp1 = mktime(0, 0, 0, $mes1, $dia1, $anio1);
        $timestamp2 = mktime(0, 0, 0, $mes2, $dia2, $anio2);

        /* resto a una fecha la otra */
        $segundos_diferencia = $timestamp1 - $timestamp2;


        /* convierto segundos en días */
        $dias_diferencia = $segundos_diferencia / (60 * 60 * 24);

        /* obtengo el valor absoluto de los dÃías 
           (quito el posible signo negativo) */
        $dias_diferencia = abs($dias_diferencia);

        /* quito los decimales a los dí­as de diferencia  */
        $dias_diferencia = floor($dias_diferencia);

        return intval($dias_diferencia);
    }

    /**
     * Compara dos fechas indicando cual es mayor, menor o iguales
     * Formato de fecha: yyyy-mm-dd
     * Devuele:
     *  Menor que 0 si fechaStd1 < fechaStd2,
     *  Igual a 0 si fechaStd1 = fechaStd2,
     *  Mayor que 0 si fechaStd1 > fechaStd2
     *
     * @param string $fecha1
     * @param string $fecha2
     *
     * @return int
     */
    public static function getDif($fecha1, $fecha2)
    {
        list($anio1, $mes1, $dia1) = explode('-', $fecha1);
        list($anio2, $mes2, $dia2) = explode('-', $fecha2);
        return mktime(0, 0, 0, $mes1, $dia1, $anio1) - 
               mktime(0, 0, 0, $mes2, $dia2, $anio2);
    }

    /**
     * Devuelve el número de año de la fecha.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return int
     */
    public static function getOnlyYear($fecha)
    {
        list($anio, ,) = explode('-', $fecha);
        return intval($anio);
    }

    /**
     * Devuelve el número de día de la fecha
     * Formato de fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return int
     */
    public static function getOnlyDay($fecha)
    {
        if (!HelpValidate::isDate($fecha)) {
            return 0;
        }
        list(, , $dia) = explode('-', $fecha);
        return intval($dia);
    }

    /**
     * Estandariza un numero de día o mes a dos caracteres con ceros
     *
     * @param $num
     *
     * @return string
     */
    public static function normalize2Chars($num)
    {
        return str_pad($num, 2, '0', STR_PAD_LEFT);
    }

    /***
     * Devuelve el dia actual formato yyyy-mm-dd
     * @return string
     */
    public static function getTodayGMT()
    {
        return gmdate('Y-m-d');
    }

    /**
     * Devuelve el día actual.
     * Formato de fecha: yyyy-mm-dd
     * @return string
     */
    public static function getToday(): string
    {
        return date('Y-m-d');
    }

    /**
     * Devuelve el separador utilizado en una fecha.
     *
     * @param string $fecha
     *
     * @return string
     */
    public static function getSeparador($fecha)
    {
        if (strpos($fecha, '/') !== false) {
            return '/';
        } elseif (strpos($fecha, '-') !== false) {
            return '-';
        } elseif (strpos($fecha, '.') !== false) {
            return '.';
        } else {
            return '';
        }
    }

    /**
     * Estandariza los separadores de la fecha al carácter -
     * Formato de fecha: yyyy-mm-dd
     *
     * @param string $fecha
     *
     * @return string
     * @see date_separador()
     */
    public static function getSanitized($fecha)
    {
        $sep = self::getSeparador($fecha);
        list($dia, $mes, $anio) = explode($sep, $fecha);
        return substr('00'.$anio, -4).'-'.
               substr('00'.$mes, -2).'-'.
               substr('00'.$dia, -2);
    }

    /**
     * Devuevle el pattern para un formato de fecha determinado.
     *
     * @param $formato
     *
     * @return string
     */
    public static function getPattern($formato = 'yyyy-mm-dd')
    {
        switch ($formato) {

            case 'dd/mm/yyyy':
            case 'mm/dd/yyyy':
                return "\\d{2}/\\d{2}/\\d{4}";

            case 'yyyy/mm/dd':
                return "\\d{4}/\\d{2}/\\d{2}";

            case 'dd-mm-yyyy':
            case 'mm-dd-yyyy':
                return "\\d{2}\\-\\d{2}\\-\\d{4}";

            case 'yyyy-mm-dd':
                return "\\d{4}\\-\\d{2}\\-\\d{2}";

            case 'dd.mm.yyyy':
            case 'mm.dd.yyyy':
                return "\\d{2}\\.\\d{2}\\.\\d{4}";

            case 'yyyy.mm.dd':
                return "\\d{4}\\.\\d{2}\\.\\d{2}";

            default:
                return "";
                break;
        }
    }

    /**
     * Devuelve el númer de la semana dentro del año de una fecha 
     * concreta
     * Formato de fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return string
     * @throws \Exception
     */
    public static function getNumberOfWeek($fecha)
    {
        $date = new DateTime($fecha);
        return $date->format("W");
    }

    /**
     * Devuelve el nombre de un mes.
     * Cuidado: se cambioa la configuración de localización
     *
     * @param $mes
     *
     * @return string
     */
    function getMonthName($mes)
    {
        setlocale(LC_ALL, "es_ES@euro", "es_ES", "esp");

        $nombre = ucfirst(strftime("%B", mktime(0, 0, 0, 
                                                $mes, 1, 2000)));
        /*  Diciembre */

        //$nombre = ucfirst(strftime("%b", mktime(0, 0, 0, 
                                                $mes, 1, 2000)));
        /*  Dec */

        return $nombre;
    }

    /**
     * Devuelve el mes actual
     * @return int (1-12)
     */
    public static function getMouthActual()
    {
        return date('n');
    }

    /**
     * Devuelve el número de mes de la fecha.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return int
     */
    public static function getOnlyMonth($fecha)
    {
        list(, $mes,) = explode('-', $fecha);
        return intval($mes);
    }

    /**
     * Devuelve el la fecha del último día de un mes y año 
     * determinado.
     * Si el mes o el año son incorrecto, devuelve null
     * Formato de fecha: yyyy-mm-dd
     *
     * @param int $month
     * @param int $year
     *
     * @return string
     */
    public static function getLastDayOfMonth($month, $year)
    {
        if ($month < 1 && $month > 12) {
            return null;
        }
        $day = date("d", mktime(0, 0, 0, $month + 1, 0, $year));

        return $year.'-'.substr('00'.$month, -2).'-'.$day;
    }

    /**
     * Devuelve la fecha del último día hábil del mes.
     * No es ni sábado ni domingo.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param int $mes
     * @param int $anio
     *
     * @return string
     */
    public static function getLastDayOfMonthHabil($mes, $anio)
    {
        $sFecha = self::getLastDayOfMonth($mes, $anio);
        $nDia   = self::getDayOfWeek($sFecha);

        if ($nDia == 0) {
            $nDia--;
        }

        if ($nDia == 6) {
            $nDia--;
        }

        return date('Y-m-d', mktime(0, 0, 0, $mes, $nDia, $anio));
    }

    /**
     * Devuelve la fecha del primer día de un mes y año determinado.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param int $month
     * @param int $year
     *
     * @return string
     */
    public static function getFirstDayOfMonth($month, $year)
    {
        if ($month < 1 && $month > 12) {
            return 0;
        }
        return $year.'-'.substr('00'.$month, -2).'-01';
    }


    /**
     * Devuelve el número de dias de un més y año
     *
     * @param        $mes
     * @param string $anio
     *
     * @return int
     */
    public static function getDaysInMonth($mes, $anio = '')
    {
        if ($mes <= 0 || $mes > 12) {
            return 0;
        }
        if (empty($anio)) {
            $anio = date('Y');
        }
        // Composer
        return cal_days_in_month(CAL_GREGORIAN, $mes, $anio);
    }

    /**
     * Devuelve el día de la semana
     *     0: "Domingo"
     *     1:  "Lunes"
     *     2:  "Martes"
     *     3:  "Miércoles"
     *     4:  "Jueves"
     *     5:  "Viernes"
     *     6:  "Sábado"
     *
     * @param string $fecha
     *
     * @return string
     */
    public static function getDayOfWeek($fecha)
    {
        return date('w', strtotime($fecha));
    }

    /**
     * Devuelve el nombre del días de la semana
     * Formato fecha: yyyy-mm-dd
     *
     * @param string $fecha
     *
     * @return string
     */
    public static function getDayName($fecha)
    {
        $nombre  = '';
        $fechats = strtotime($fecha);
        switch (date('w', $fechats)) {
            case 0:
                $nombre = "Domingo";
                break;
            case 1:
                $nombre = "Lunes";
                break;
            case 2:
                $nombre = "Martes";
                break;
            case 3:
                $nombre = "Miercoles";
                break;
            case 4:
                $nombre = "Jueves";
                break;
            case 5:
                $nombre = "Viernes";
                break;
            case 6:
                $nombre = "Sábado";
                break;
        }
        return $nombre;
    }

    /**
     * Partiendo de una fecha en un foramto determinado, devuelve el 
     * dia, mes y año
     *
     * @param $value
     * @param $dia
     * @param $mes
     * @param $anio
     */
    public static function explode($value, &$dia, &$mes, &$anio)
    {
        $dia = $mes = $anio = 0;
        list($anio, $mes, $dia) = explode('-', $value);
    }

    /**
     * Calcula la edad de una persona por la fecha de su nacimiento
     *
     * @param string $fecha
     *
     * @return int
     */
    public static function calularEdat($fecha)
    {
        return intval(self::getDifDays($fecha, date("Y-m-d")) / 365);
    }

    /**
     * Suma un número de meses a una fecha.
     * Formato de fecha: yyyy-mm-dd.
     *
     * @param string $fecha
     * @param int    $meses
     *
     * @return string
     */
    public static function sumarMeses($fecha, $meses)
    {
        list($anio, $mes, $dia) = explode('-', $fecha);

        if ($mes + $meses > 12) {

            $sumarMeses = (intval(($mes + $meses) % 12));
            $sumarAnys  = intval(($mes + $meses) / 12);
            $mes        = $sumarMeses; /* -- No se suma */
            $anio       += $sumarAnys;

        } else {

            $mes  += $meses;
            $anio += 0;
        }
        return $anio.'-'.
               substr('00'.$mes, -2).'-'.
               substr('00'.$dia, -2);
    }

    /**
     * Suma un valor a una fecha.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param string $fecha
     * @param int    $dd
     * @param int    $mm
     * @param int    $yy
     * @param int    $hh
     * @param int    $mn
     * @param int    $ss
     *
     * @return string
     */
    public static function sumarFecha( $fecha, $dd = 0, 
                                               $mm = 0, 
                                               $yy = 0, 
                                               $hh = 0, 
                                               $mn = 0, 
                                               $ss = 0): string
    {
        list($any, $mes, $dia) = explode('-', $fecha);
        $date   = $any.'-'.$mes.'-'.$dia;
        $date_r = getdate(strtotime($date));
        return date('Y-m-d',
                    mktime(($date_r[ "hours" ] + $hh),
                        ($date_r[ "minutes" ] + $mn),
                        ($date_r[ "seconds" ] + $ss),
                        ($date_r[ "mon" ] + $mm),
                        ($date_r[ "mday" ] + $dd),
                        ($date_r[ "year" ] + $yy)));
    }

    /**
     * Suma N días naturales a una fecha.
     * Formato de fecha: yyyy-mm-dd
     *
     * @param string $fecha
     * @param int    $dias
     *
     * @return string
     */
    public static function sumarDiasNaturales($fecha, $dias)
    {
        if ($dias < 0) {
            return '';
        }

        $dateArray = explode("-", $fecha);

        $sd = $dias;

        while ($sd > 0) {
            if ($sd <= date("t", mktime(0, 0, 0,
                                        $dateArray[ 1 ],
                                        1,
                                        $dateArray[ 0 ])) - 
                                 $dateArray[ 2 ]) {

                $dateArray[ 2 ] = $dateArray[ 2 ] + $sd;

                $sd = 0;

            } else {

                $sd = $sd - (date("t", mktime(0, 0, 0,
                                              $dateArray[ 1 ],
                                              1,
                                              $dateArray[ 0 ])) - 
                                   $dateArray[ 2 ]);
                $dateArray[ 2 ] = 0;

                if ($dateArray[ 1 ] < 12) {
                    $dateArray[ 1 ]++;
                } else {
                    $dateArray[ 1 ] = 1;
                    $dateArray[ 0 ]++;
                }
            }
        }

        $sDia = '00'.$dateArray[ 2 ];
        $sDia = substr($sDia, -2);

        $sMes = '00'.$dateArray[ 1 ];
        $sMes = substr($sMes, -2);

        return $dateArray[ 0 ].'-'.$sMes.'-'.$sDia;
    }

}

 

Deja una respuesta

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