date_isodate_set()
Aprende la función PHP date_isodate_set(): establece una fecha en DateTime por año ISO 8601, semana y día. Sintaxis, ejemplos y relación con DateTime::setISODate().
La función date_isodate_set() establece la fecha de un object DateTime usando el calendario de semanas ISO 8601 — es decir, por año, número de semana y día de la semana, en lugar de por mes y día. Es el alias procedimental del método DateTime::setISODate(), por lo que ambos hacen exactamente lo mismo.
Esta página cubre la sintaxis de la función, cómo difiere el calendario de semanas ISO del calendario ordinario, ejemplos ejecutables y los errores más comunes.
Sintaxis
La función date_isodate_set() tiene la siguiente sintaxis:
Sintaxis de la función PHP date_isodate_set()
date_isodate_set(DateTime $object, int $year, int $week, int $dayOfWeek = 1): DateTimedonde:
$object— el objectDateTimea modificar (se cambia en el lugar).$year— el año ISO.$week— el número de semana ISO,1–53.$dayOfWeek— el día de la semana,1para el lunes y7para el domingo (opcional, por defecto1).
La función devuelve el mismo object DateTime, por lo que las llamadas se pueden encadenar. La llamada equivalente en orientación a objetos es:
$date->setISODate($year, $week, $dayOfWeek);Por qué usar fechas de semana ISO
A diferencia del calendario ordinario, ISO 8601 numera cada semana del año e identifica una fecha por (año, semana, día de la semana). Esto es útil para informes de negocios, programación y cualquier sistema que piense en semanas en lugar de meses.
Vale la pena recordar dos reglas:
- La semana 1 es la semana que contiene el primer jueves del año — equivalentemente, la semana que contiene el 4 de enero. Por ello, los primeros días de enero pueden pertenecer al año ISO anterior, y los últimos días de diciembre pueden pertenecer al siguiente.
- Los valores fuera de rango se desbordan en lugar de lanzar un error. Pedir la semana
53o el día7de una semana que no existe simplemente avanza la fecha a la semana o al año siguiente. Por ejemplo,date_isodate_set($d, 2022, 52, 7)aterriza en2023-01-01, porque la semana 52 de 2022 termina el domingo 1 de enero de 2023.
Nota:
date_isodate_set()solo cambia la parte de la fecha. La hora del día permanece tal como la tenía elDateTime(la hora actual para un object recién creado).
Ejemplos
Uso básico
Establece una fecha al 3er día (miércoles) de la 10ª semana ISO de 2023:
La función cambia $date en el lugar. Partimos de una hora fija para que la salida sea la misma en cada ejecución; solo se reemplaza la parte de la fecha.
Los números de semana pueden cruzar el límite del año
Pedir el último día de la última semana de 2022 te lleva a enero de 2023 — así funciona el calendario ISO, no es un error:
La semana 52 de 2022 termina el domingo 1 de enero de 2023, por lo que esa es la fecha devuelta.
Equivalente en orientación a objetos
DateTime::setISODate() hace el mismo trabajo y devuelve el object, lo que permite encadenar una llamada a format() directamente:
Esto establece la fecha al 1er día (lunes) de la semana 24 de 2023.
Funciones relacionadas
date_create()— crea un objectDateTimepara pasar como argumento.date_format()— formatea la fecha resultante para su visualización.
Conclusión
date_isodate_set() establece un DateTime a un (año, semana, día de la semana) específico usando el calendario de semanas ISO 8601. Recuerda que la semana ISO 1 contiene el primer jueves del año, que los valores de semana y día se desbordan hacia la semana o el año siguiente en lugar de generar un error, y que solo se cambia la fecha — no la hora.