PHP DateTimeZone
La clase DateTimeZone se encarga de representar una zona horaria (timezone).
A continuación podemos ver la descripción de la clase, la cual muestra sus constantes como también sus métodos.
Descripción de la clase class DateTimeZone {
/* Constants */
const int AFRICA = 1;
const int AMERICA = 2;
const int ANTARCTICA = 4;
const int ARCTIC = 8;
const int ASIA = 16;
const int ATLANTIC = 32;
const int AUSTRALIA = 64;
const int EUROPE = 128;
const int INDIAN = 256;
const int PACIFIC = 512;
const int UTC = 1024;
const int ALL = 2047;
const int ALL_WITH_BC = 4095;
const int PER_COUNTRY = 4096;
/* Methods */
public __construct(string $timezone)
public getLocation(): array|false
public getName(): string
public getOffset(DateTimeInterface $datetime): int
public getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false
public static listAbbreviations(): array
public static listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array
}
$obj como referencia al objeto creado con la clase
Constantes
Hagamos un pequeño ejemplo con una constante:
getting the zone constat<?php $zone = DateTimeZone::AFRICA; echo $zone;
OK, pero esto no parece demasiado útil, ¿en qué usamos las constantes?
Hagamos un segundo ejemplo, esta vez creando un nuevo DateTimeZone.
<?php
$d = new DateTimeZone("Africa/Abidjan");
$thelist=$d->listIdentifiers(DateTimeZone::AFRICA);
echo var_dump($thelist);
array(52) {
[0]=>
string(14) "Africa/Abidjan"
[1]=>
string(12) "Africa/Accra"
[2]=>
string(18) "Africa/Addis_Ababa"
[3]=>
string(14) "Africa/Algiers"
[4]=>
string(13) "Africa/Asmara"
[5]=>
string(13) "Africa/Bamako"
[6]=>
string(13) "Africa/Bangui"
[7]=>
string(13) "Africa/Banjul"
[8]=>
string(13) "Africa/Bissau"
[9]=>
string(15) "Africa/Blantyre"
[10]=>
string(18) "Africa/Brazzaville"
[11]=>
string(16) "Africa/Bujumbura"
[12]=>
string(12) "Africa/Cairo"
[13]=>
string(17) "Africa/Casablanca"
[14]=>
string(12) "Africa/Ceuta"
[15]=>
string(14) "Africa/Conakry"
[16]=>
string(12) "Africa/Dakar"
[17]=>
string(20) "Africa/Dar_es_Salaam"
[18]=>
string(15) "Africa/Djibouti"
[19]=>
string(13) "Africa/Douala"
[20]=>
string(15) "Africa/El_Aaiun"
[21]=>
string(15) "Africa/Freetown"
[22]=>
string(15) "Africa/Gaborone"
[23]=>
string(13) "Africa/Harare"
[24]=>
string(19) "Africa/Johannesburg"
[25]=>
string(11) "Africa/Juba"
[26]=>
string(14) "Africa/Kampala"
[27]=>
string(15) "Africa/Khartoum"
[28]=>
string(13) "Africa/Kigali"
[29]=>
string(15) "Africa/Kinshasa"
[30]=>
string(12) "Africa/Lagos"
[31]=>
string(17) "Africa/Libreville"
[32]=>
string(11) "Africa/Lome"
[33]=>
string(13) "Africa/Luanda"
[34]=>
string(17) "Africa/Lubumbashi"
[35]=>
string(13) "Africa/Lusaka"
[36]=>
string(13) "Africa/Malabo"
[37]=>
string(13) "Africa/Maputo"
[38]=>
string(13) "Africa/Maseru"
[39]=>
string(14) "Africa/Mbabane"
[40]=>
string(16) "Africa/Mogadishu"
[41]=>
string(15) "Africa/Monrovia"
[42]=>
string(14) "Africa/Nairobi"
[43]=>
string(15) "Africa/Ndjamena"
[44]=>
string(13) "Africa/Niamey"
[45]=>
string(17) "Africa/Nouakchott"
[46]=>
string(18) "Africa/Ouagadougou"
[47]=>
string(17) "Africa/Porto-Novo"
[48]=>
string(15) "Africa/Sao_Tome"
[49]=>
string(14) "Africa/Tripoli"
[50]=>
string(12) "Africa/Tunis"
[51]=>
string(15) "Africa/Windhoek"
}
Lista de Constantes
DateTimeZone::AFRICA- Africa time zones.
DateTimeZone::AMERICA- America time zones.
DateTimeZone::ANTARCTICA- Antarctica time zones.
DateTimeZone::ARCTIC- Arctic time zones.
DateTimeZone::ASIA- Asia time zones.
DateTimeZone::ATLANTIC- Atlantic time zones.
DateTimeZone::AUSTRALIA- Australia time zones.
DateTimeZone::EUROPE- Europe time zones.
DateTimeZone::INDIAN- Indian time zones.
DateTimeZone::PACIFIC- Pacific time zones.
DateTimeZone::UTC- UTC time zones.
DateTimeZone::ALL- All time zones.
DateTimeZone::ALL_WITH_BC- All time zones including backwards compatible.
DateTimeZone::PER_COUNTRY- Time zones per country.
Creo que es suficiente para las constantes, veamos ahora los métodos.
Métodos
En esta sección veremos los diferentes métodos que posee DateTimeZone
__construct
El método constructor posee un argumento, el cual es obligatorio, este crea un nuevo objeto DateTimeZone, $timezone debe ser un string, el cual puede ser de los siguientes valores: nombre de zona horaria(timezone name), un valor offset por ejemplo "+0200", "-0100" u otos y por último, abreviaciones de zona horaria Ejemplo "BST", "CEST", etc.
public DateTimeZone::__construct(string $timezone)
No daje ejemplos, ya que di ejemplos antes en constantes.
getLocation()
Retorna información para una zona horaria (timezone)
Descriptionpublic DateTimeZone::getLocation(): arraySintaxis
$obj->getLocation()
Retorna un array con la información o false en caso de fallo.
<?php
$tz = new DateTimeZone("America/Costa_Rica");
print_r($tz->getLocation());
?>
Array
(
[country_code] => CR
[latitude] => 9.93333
[longitude] => -84.08334
[comments] =>
)
Este método puede que no le parezca útil, pero saber el código del país es realmente útil
getName
Devuelve el nombre de la zona horaria como un string
Descriptionpublic DateTimeZone::getName(): stringSintaxis
$obj->getName()getName method exampe
<?php
$tz = new DateTimeZone("America/Costa_Rica");
print_r($tz->getName());
?>
America/Costa_Rica
getOffset
Devuelve el índice de la zona horaria (timestamp) de GMT, siendo GMT (Greenwich Mean Time) en otras palabras es el índice con respecto a GMT.
Descriptionpublic DateTimeZone::getOffset(DateTime $datetime): intSintaxis
$obj->getOffset($datetime)
En la página de PHP hay un ejemplo sobre esto, he cambiado un poco el ejemplo, para utilizar a Uruguay y España como países de referencia. España posee 2 horas mas que GMT y por su parte Uruguay posee 3 horas menos en el momento de escribir este post.
<?php
$dateTimeZoneMontevideo = new DateTimeZone("America/Montevideo");
$dateTimeZoneMadrid = new DateTimeZone("Europe/Madrid");
$dateTimeMontevideo = new DateTime("now", $dateTimeZoneMontevideo);
$dateTimeMadrid = new DateTime("now", $dateTimeZoneMadrid);
$timeOffset = $dateTimeZoneMadrid->getOffset($dateTimeMontevideo);
$timeOffset2= $dateTimeZoneMontevideo->getOffset($dateTimeMadrid);
var_dump($timeOffset);
var_dump($timeOffset2);
int(7200) int(-10800)
Podemos darnos cuenta de que este entero son las horas de España y Uruguay escritas en segundos, ya que 7200 ÷ 60 ÷ 60 = 2 y -10800 ÷ 60 ÷ 60 = -3
getTransitions
Este método devuelve las transiciones de la timezone o zona horaria. Tenga en cuenta que muchos paises tiene varias zonas horarias debido al ahorro energético. Por ejemplo, Uruguay tiene 3 horas menos que el GMT, pero en verano este horario cambia.
method descriptionpublic DateTimeZone::getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|falseSintaxis
$obj->getTransitions($timestampBegin,$timestampEnd)
En la descripción del método podemos ver que tenemos un timestamp de inicio y un timestamp de fin. Con ellos definimos el periodo en el cual queremos obtener las transiciones.
getTransition Example<?php
$zona_horaria = new DateTimeZone("America/Montevideo");
$transiciones = $zona_horaria->getTransitions(631152000,PHP_INT_MAX);//631152000 se refiere al año 1990
print_r(array_slice($transiciones, 0, 3));
?>
Estos serian las 3 primeras transiciones desde 1990.
DateTimeZone::listAbbreviations
Devuelve un array asociativo conteniendo el DST, offset y e el nombre de la zona horaria.
Descriptionpublic static DateTimeZone::listAbbreviations(): arraySintaxis
DateTimeZone::listAbbreviations()
Veamos un ejemplo.
getting all abbreviations from Australia<?php $timezone_abbreviations = DateTimeZone::listAbbreviations(); print_r($timezone_abbreviations["acst"]); ?>
En este ejemplo se obtendrán todas las abreviaciones acst(Australian Central Standard Time).
DateTimeZone::listIdentifiers
Devuelve un array indexado numéricamente que contiene todos los identificadores de zonas horarias(timezones) definidos
Descriptionpublic static DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null)Sintaxis
DateTimeZone::listIdentifiers($timezoneGroup,$countryCode)
Ya hemos hecho un ejemplo de listidentifiers antes en constantes, pero cometí un error que no debes realizar y es que llame el método con -> en vez de :: aunque de todos modos funciono esto no siempre funciona.
Veamos un ejemplo sencillo con los identificadores de Australia.
listIdentifiers example<?php $timezone_identifiers = DateTimeZone::listIdentifiers(DateTimeZone::AUSTRALIA); var_dump($timezone_identifiers) ?>
array(11) {
[0]=>
string(18) "Australia/Adelaide"
[1]=>
string(18) "Australia/Brisbane"
[2]=>
string(21) "Australia/Broken_Hill"
[3]=>
string(16) "Australia/Darwin"
[4]=>
string(15) "Australia/Eucla"
[5]=>
string(16) "Australia/Hobart"
[6]=>
string(18) "Australia/Lindeman"
[7]=>
string(19) "Australia/Lord_Howe"
[8]=>
string(19) "Australia/Melbourne"
[9]=>
string(15) "Australia/Perth"
[10]=>
string(16) "Australia/Sydney"
}

