Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:snippets:fechas

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:programacion:php:snippets:fechas [2021/11/02 16:58] – [Creación] tempwininformatica:programacion:php:snippets:fechas [2025/06/18 15:57] (actual) – [UTC a otra zona horaria] tempwin
Línea 13: Línea 13:
 <code php> <code php>
 $fecha = new DateTime("2020-03-01"); $fecha = new DateTime("2020-03-01");
 +</code>
 +
 +A partir de cualquier fecha con cierto formato:
 +
 +<code php>
 +$fecha = DateTime::createFromFormat("d/m/Y H:i:s", "20/10/2021 10:45:11");
 </code> </code>
  
Línea 38: Línea 44:
 $fecha = new DateTime("last day of last month"); $fecha = new DateTime("last day of last month");
 </code> </code>
 +
 +Último domingo:
 +
 +<code php>
 +$fecha = date("Y-m-d", strtotime("last week sunday"));
 +</code>
 +
 +<WRAP center round info 60%>
 +Para más información, se pueden consultar los [[https://www.php.net/manual/es/datetime.formats.relative.php|diferentes formatos relativos de fecha/hora]] que entiende el analizador de ''strtotime()'', ''DateTime'' y ''date_create()''
 +</WRAP>
 +
 ==== Semanas ==== ==== Semanas ====
  
Línea 51: Línea 68:
 Año según el número de la semana ISO-8601. Esto tiene el mismo valor que ''Y'', excepto que si el número de la semana ISO (''W'') pertenece al año anterior o siguiente, se usa ese año en su lugar Año según el número de la semana ISO-8601. Esto tiene el mismo valor que ''Y'', excepto que si el número de la semana ISO (''W'') pertenece al año anterior o siguiente, se usa ese año en su lugar
 </WRAP> </WRAP>
 +
 +Fecha de inicio de cierta semana del año:
 +
 +<code php>
 +$ano = 2022;
 +$semana = 49;
 +
 +$fecha_inicio_semana = date("Y-m-d", strtotime($ano . "W" . $semana)); // 2022-12-05
 +</code>
 +
 +  * [[https://stackoverflow.com/questions/1659551/how-to-get-the-first-day-of-a-given-week-number-in-php-multi-platform|How to get the first day of a given week number in PHP (multi-platform)?]]
 +
 +
 ===== Intervalos ===== ===== Intervalos =====
  
Línea 152: Línea 182:
          
 echo (getWorkingHoursInSeconds($f, $f2, $working_hours ) / 3600) . " horas"; echo (getWorkingHoursInSeconds($f, $f2, $working_hours ) / 3600) . " horas";
 +</code>
 +
 +==== Número de lunes entre fechas ====
 +
 +<code php>
 +// Calcular número de lunes entre fechas
 +function getMondaysInRange($dateFromString, $dateToString) {
 +    $dateFrom = new \DateTime($dateFromString);
 +    $dateTo = new \DateTime($dateToString);
 +    $dates = [];
 +
 +    if ($dateFrom > $dateTo) {
 +        return $dates;
 +    }
 +
 +    if (1 != $dateFrom->format('N')) {
 +        $dateFrom->modify('next monday');
 +    }
 +
 +    while ($dateFrom <= $dateTo) {
 +        $dates[] = $dateFrom->format('Y-m-d');
 +        $dateFrom->modify('+1 week');
 +    }
 +
 +    return $dates;
 +}
 +
 +$dateFromString = '2019-01-01';
 +$dateToString = '2022-01-01';
 +var_dump(getMondaysInRange($dateFromString, $dateToString));
 +
 </code> </code>
 ===== Modificación ===== ===== Modificación =====
Línea 190: Línea 251:
 $timeFormat = sprintf('%02d:%02d:%02d', $horas, $minutos, $segundos); $timeFormat = sprintf('%02d:%02d:%02d', $horas, $minutos, $segundos);
 </code> </code>
 +
 +==== UTC a otra zona horaria ====
 +
 +Si tenemos un string con una fecha en UTC, por ejemplo:
 +
 +<code>
 +2025-08-31 19:57:25.000000 UTC
 +</code>
 +
 +Para pasarla a la zona horaria de España:
 +
 +<code php>
 +$fechaString = "2025-08-31 19:57:25.000000 UTC";
 +
 +// Creamos un objeto DateTime indicando explícitamente que la cadena de fecha está en UTC
 +$fechaUTC = new DateTime($fechaString, new DateTimeZone('UTC'));
 +
 +$fechaES = clone $fechaUTC;
 +
 +// Pasamos a la zona horaria de España:
 +$fechaES->setTimezone(new DateTimeZone('Europe/Madrid'));
 +</code>
 +
 +PHP maneja automáticamente el cambio horario de verano/invierno (último domingo de marzo,+2h CEST, último domingo de octubre, +1h CET).
 +
 +<WRAP center round info 60%>
 +El horario de verano en España se cambia el último domingo de marzo y serían 2 horas sobre UTC (UTC+2). En el de invierno, que se cambia el último domingo de octubre, sería 1 hora sobre UTC (UTC+1). Al horario de verano también se le llama **DST**, de //Daylight Saving Time//, que sería algo como "Horario de ahorro de luz diurna".
 +</WRAP>
 +
 ===== Recursos ===== ===== Recursos =====
  
   * [[https://www.webfx.com/blog/web-design/php-dateinterval-class/|An Introduction to the PHP DateInterval Class]]   * [[https://www.webfx.com/blog/web-design/php-dateinterval-class/|An Introduction to the PHP DateInterval Class]]
   * [[https://www.php.net/manual/es/datetime.formats.relative.php|Formatos de fecha relativos]]   * [[https://www.php.net/manual/es/datetime.formats.relative.php|Formatos de fecha relativos]]
informatica/programacion/php/snippets/fechas.1635868694.txt.gz · Última modificación: por tempwin