W3docs

timezone_open()

La función timezone_open es una función integrada de PHP que crea un nuevo objeto DateTimeZone a partir de un identificador de zona horaria.

La función PHP timezone_open()

timezone_open() crea un nuevo objeto DateTimeZone a partir de un identificador de zona horaria. Es el alias en estilo procedural de new DateTimeZone() — ambos hacen exactamente lo mismo, por lo que puedes usar el que mejor se adapte a tu código.

Un objeto DateTimeZone por sí solo no "hace" nada. Su función es ser pasado a un objeto DateTime para que las marcas de tiempo se interpreten y muestren en la zona correcta. Esto es lo que hace útil a timezone_open(): permite que un mismo script muestre el mismo instante de tiempo correctamente para usuarios en Nueva York, París o Tokio.

Sintaxis

timezone_open(string $timezone): DateTimeZone|false

Parámetro

  • $timezone — un identificador de zona horaria. Usa un nombre IANA completo como "America/New_York", "Europe/Paris" o "UTC". Las abreviaturas como "EST" se aceptan pero son ambiguas y es mejor evitarlas. La lista completa proviene de timezone_identifiers_list().

Valor de retorno

  • Un objeto DateTimeZone en caso de éxito.
  • false si el identificador no es reconocido (también se genera un Warning). Por esta razón, valida siempre los identificadores proporcionados por el usuario antes de pasarlos.

Ejemplos prácticos

Ejemplo 1: Establecer la zona horaria predeterminada

timezone_open() no cambia la zona horaria predeterminada del script — esa es la función de date_default_timezone_set(). Establécela una vez cerca del inicio del script para que cualquier DateTime creado sin una zona explícita use la correcta:

<?php

date_default_timezone_set('America/New_York');

echo date_default_timezone_get(); // America/New_York

Ejemplo 2: Crear un DateTime con una zona horaria específica

Pasa el objeto devuelto por timezone_open() como segundo argumento al constructor de DateTime. 'now' se interpreta entonces en esa zona:

php— editable, runs on the server

La P al final del formato imprime el desplazamiento UTC (por ejemplo +02:00), lo que permite confirmar que la zona fue aplicada.

Ejemplo 3: Convertir entre zonas horarias

Un DateTime siempre almacena un instante absoluto. Llamar a setTimezone() no mueve el instante — solo cambia cómo se muestra. Aquí el mediodía en Nueva York se muestra como el equivalente en hora local en París:

php— editable, runs on the server

El reloj avanza seis horas porque París lleva seis horas de ventaja sobre Nueva York en enero.

Ejemplo 4: Protección ante un identificador inválido

Dado que timezone_open() devuelve false en caso de fallo, comprueba el resultado antes de usarlo — especialmente cuando el identificador proviene de la entrada del usuario:

<?php

$tz = @timezone_open('Mars/Olympus_Mons');

if ($tz === false) {
    echo 'Unknown timezone, falling back to UTC.';
    $tz = timezone_open('UTC');
}

echo "\n", $tz->getName(); // UTC

Cuándo usar timezone_open()

  • Mostrar un mismo instante en varias zonas — almacena todo en UTC y convierte al mostrar con setTimezone().
  • Leer el desplazamiento o el nombre de zona de un DateTime mediante timezone_name_get() o timezone_offset_get().
  • Bases de código procedurales que prefieren llamadas function() sobre new por coherencia.

Si escribes PHP orientado a objetos, new DateTimeZone('Europe/Paris') resulta más natural y se comporta de forma idéntica.

Conclusión

timezone_open() construye un objeto DateTimeZone a partir de un identificador para que los valores DateTime se interpreten y muestren en la zona correcta. Las ideas clave: es intercambiable con new DateTimeZone(), devuelve false ante un identificador incorrecto (por lo que debes validar la entrada), y setTimezone() solo cambia la hora mostrada, nunca el instante subyacente. Para una visión más amplia, consulta PHP Timezones y PHP Date and Time.

Práctica

Práctica
¿Qué se puede decir sobre la clase 'DateTimeZone' en PHP, según se describe en la página web proporcionada?
¿Qué se puede decir sobre la clase 'DateTimeZone' en PHP, según se describe en la página web proporcionada?
Was this page helpful?