2010-08-13 25 views
6

Me pregunto cuál es la duración máxima de la configuración de zona horaria en PHP? Estoy almacenando la cadena en una base de datos, y me gustaría mantener la longitud lo más corta posible, pero veo zonas horarias como "Canadá/Este de Saskatchewan", que va más allá de nuestro límite actual.PHP TZ configuración de longitud

Si pudiera obtener una lista de toda la cadena de zona horaria admitida, puedo ordenarlas, pero actualmente están divididas en varias páginas diferentes.

linky: http://www.php.net/manual/en/timezones.php

+2

Gracias por ser una comunidad acogedora. – karlw

Respuesta

12

es 32. Y aquí está el código completo de PHP para encontrar que:

<?php 
$timezone_identifiers = DateTimeZone::listIdentifiers(); 

$maxlen = 0; 
foreach($timezone_identifiers as $id) 
{ 
    if(strlen($id) > $maxlen) 
     $maxlen = strlen($id); 
} 

echo "Max Length: $maxlen"; 

/* 
Output: 

Max Length: 32 

*/ 
?> 
+3

Es importante tener en cuenta que el OP establecer el ancho en 32 sería un gran error. Se debe establecer más alto, por las dudas. – Buggabill

+8

Pensé que la respuesta es 42 - ¿no es siempre 42? –

+0

@Jonathan - Iba a decir esto pero no quería que el OP lo usara ...:-) – Buggabill

0

Cada zona horaria puede abreviarse en 4 caracteres o menos. (http://www.timeanddate.com/library/abbreviations/timezones/) Entonces, entonces, tal vez pueda construir fácilmente una matriz estática de las zonas horarias de nombre completo vinculándolas a su nombre abreviado. Esto te permitirá usar ambos.

$timeZone = 'Canada/East-Saskatchewan'; 
$tz = DateTimeZone::listAbbreviations(); 
echo recursiveArraySearch($tz, $timeZone); 
function recursiveArraySearch($haystack, $needle, $index = null) { 
    $aIt  = new RecursiveArrayIterator($haystack); 
    $it = new RecursiveIteratorIterator($aIt); 
    while($it->valid()) {  
     if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) { 
      return $aIt->key(); 
     } 
     $it->next(); 
    } 
    return false; 
} 
+2

No solo. Por ejemplo, observe que hay tres zonas diferentes llamadas "EST". No solo eso, sino que los dos tipos de descriptores ni siquiera describen la misma cosa. Por ejemplo, la zona de Olson 'América/Denver' corresponde al nombre de tres letras 'MST' en invierno y 'MDT' en verano, mientras que 'América/Phoenix' corresponde a 'MST' durante todo el año. Por lo menos necesita un descriptor de zona POSIX como 'MST7MDT, M3.2.0, M11.1.0' pero incluso eso en realidad contiene menos información :) – hobbs

+0

Buena captura. Olvidé dar cuenta de los ahorros de luz diurna. Analizaré cómo trabajar para encontrar la forma de acomodarlo. –

1

Desde el manual: Respuesta

<?php 
$timezone_identifiers = DateTimeZone::listIdentifiers(); 
for ($i=0; $i < 5; $i++) { 
    echo "$timezone_identifiers[$i]\n"; 
} 
?> 
8

La base de datos Olson - disponible a partir ftp://ftp.iana.org/tz/releases/ o http://www.iana.org/time-zones (pero vea también http://www.twinsun.com/tz/tz-link.htm* y http://en.wikipedia.org/wiki/Tz_database) - es th e fuente de estos nombres. La documentación en el archivo Teoría incluye una descripción de cómo se forman los nombres de las zonas. Esto te ayudaría a establecer cuánto tiempo pueden ser los nombres.

Los nombres más largos '' actuales son 30 caracteres (América/Argentina/Buenos_Aires, América/Argentina/Rio_Gallegos, Latina/Dakota_del_Norte/New_Salem); el nombre más largo de "compatibilidad con versiones anteriores" es de 32 caracteres (América/Argentina/ComodRivadavia).

*Tenga en cuenta que el sitio Twinsun no ha sido actualizado desde hace algún tiempo y tiene algunos enlaces obsoletos (como lo que sugiere que la base de datos está disponible de Olson ftp://ftp.elsie.nci.nih.gov - que ya está disponible en IANA en su lugar).

0

Si está utilizando MySQL con PHP, MySQL consideran que ya se almacena nombres de zona horaria Olson en la base de datos del sistema "mysql", en una tabla llamada "time_zone_name", en una columna llamada "nombre". Una opción es elegir la longitud de la columna para que coincida con la longitud que usa MySQL. En MySQL 5.7, la longitud del nombre de la zona horaria es de 64 caracteres. Para determinar la longitud en uso en la instalación de MySQL, siga el siguiente ejemplo:

mysql> use mysql 
Database changed 
mysql> describe time_zone_name; 
+--------------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+--------------+------------------+------+-----+---------+-------+ 
| Name   | char(64)   | NO | PRI | NULL |  | 
| Time_zone_id | int(10) unsigned | NO |  | NULL |  | 
+--------------+------------------+------+-----+---------+-------+ 
2 rows in set (0.01 sec) 
Cuestiones relacionadas