2012-09-22 29 views
10

Estoy tratando de encontrar la longitud máxima de un identificador de zona horaria. Esta es la cadena utilizada como el nombre de la zona horaria (por ejemplo, "América/Nueva_York"). La base de datos tz no es útil; No pude encontrar detalles de implementación.Longitud máxima del campo "tzname"/nombre del identificador de zona horaria

Microsoft (.NET Framework 4.5) suggests a max length of 32, pero esto parece ser una limitación de su registro.

libc points to a limit called "_POSIX_TZNAME_MAX", which is 3 characters long, pero este es un requisito mínimo absoluto para el cumplimiento de POSIX. Normalmente, supongo que una implementación usará más.

Así que la verdadera pregunta es: ¿Cuál es una longitud de cadena aceptable para almacenar con seguridad la zona horaria "tzname"/nombre del identificador?

Respuesta

18

¿Por qué no utilizar un contenedor que no le importa cuál es su longitud, como p. std::string?

Ahora, sucede que estaba trabajando recientemente con el TZ db como se proporciona en el formato csv común (por ejemplo, aquí in a file from CERN), pero el mismo formato también se utiliza en las fuentes de Boost.

Con esos datos, estoy viendo una longitud máxima de 28:

R> library(RcppBDT)      # R package interfacing Boost Date_Time 
Loading required package: Rcpp 
R> tz <- new(bdtTz, "America/Chicago") # init. an object, using my default TZ 
R> tznames <- tz$getAllRegions()   # retrieve list of all TZ names 
R> 
R> length(tznames)      # total number of TZ identifiers 
[1] 381 
R> 
R> head(tznames)       # look at first six 
[1] "Africa/Abidjan"  "Africa/Accra"  "Africa/Addis_Ababa" 
[4] "Africa/Algiers"  "Africa/Asmera"  "Africa/Bamako"  
R> 
R> summary(sapply(tznames, nchar))  # numerical summary of length of each 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
     9  13  15  15  17  28 
R> 
R> tznames[ nchar(tznames) >= 26 ]  # looking at length 26 and above 
[1] "America/Indiana/Indianapolis" "America/Kentucky/Louisville" 
[3] "America/Kentucky/Monticello" "America/North_Dakota/Center" 
R> 

También podemos mirar un histograma:

R> library(MASS) 
R> truehist(sapply(tznames, nchar), 
+   main="Distribution of TZ identifier length", col="darkgrey") 
R> 

enter image description here

Esto utiliza código que tengo en mi paquete RcppBDT SVN repo on R-Forge pero aún no en el CRAN version del paquete.

+2

¡Respuesta asombrosa! En realidad, no puedo usar cadenas de longitud variable porque quiero almacenar esas cadenas en una base de datos. Al principio, no quería usar un campo de caracteres arbitrariamente largo, pero creo que tengo una cadena larga de 40 caracteres [1]. Los pondré en una tabla separada y los referiré a ellos usando claves foráneas. 1: Hay una zona horaria ("América/Argentina/ComodRivadavia") que en realidad tiene 32 char de longitud. En el futuro podría haber otros nombres igualmente largos. – sleblanc

+0

¿No puedes usar varchar en SQL? –

+2

¿Los varchars realmente no requieren una longitud especificada? – sleblanc

Cuestiones relacionadas