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|falsePará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 detimezone_identifiers_list().
Valor de retorno
- Un objeto
DateTimeZoneen caso de éxito. falsesi el identificador no es reconocido (también se genera unWarning). 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_YorkEjemplo 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:
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:
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(); // UTCCuá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
DateTimemediantetimezone_name_get()otimezone_offset_get(). - Bases de código procedurales que prefieren llamadas
function()sobrenewpor 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.