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; } }