2012-09-22 20 views
10

Sto cercando di trovare la lunghezza massima di un identificatore del fuso orario. Questa è la stringa utilizzata come nome del fuso orario (ad esempio "America/New_York"). Il database tz non è utile; Non sono riuscito a trovare dettagli di implementazione.Lunghezza massima del campo "tzname" nome dell'identificatore del fuso orario

Microsoft (.NET Framework 4.5) suggests a max length of 32, ma questa sembra essere una limitazione del loro registro.

libc points to a limit called "_POSIX_TZNAME_MAX", which is 3 characters long, ma questo è un requisito minimo assoluto per la conformità POSIX. In genere, immagino che un'implementazione utilizzerà di più.

Quindi la vera domanda è: qual è una lunghezza di stringa accettabile per memorizzare in modo sicuro il fuso orario "tzname"/nome identificativo?

risposta

18

Perché non utilizzare un contenitore a cui non importa quale sia la lunghezza - come ad es. std::string?

Ora accade che stavo lavorando di recente con il db TZ come fornito nel formato csv comune (ad es. Qui in a file from CERN) ma lo stesso formato viene utilizzato anche nelle fonti Boost.

Con quei dati, sto vedendo una lunghezza massima di 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> 

Possiamo anche guardare un istogramma:

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

enter image description here

Questo utilizza codice che ho nel mio pacchetto RcppBDT SVN repo on R-Forge ma non ancora nello CRAN version del pacchetto.

+2

Sorprendente risposta! In realtà, non posso usare stringhe di lunghezza variabile perché voglio memorizzare quelle stringhe in un database. All'inizio non volevo utilizzare un campo char arbitrariamente lungo, ma penso di essere impostato su una stringa lunga 40 caratteri [1]. Metterò questi in una tabella separata e fare riferimento a loro utilizzando le chiavi esterne. 1: C'è un fuso orario ("America/Argentina/ComodRivadavia") che in realtà è lungo 32 caratteri. In futuro potrebbero esserci altri nomi ugualmente lunghi. – sleblanc

+0

Non puoi usare varchar in SQL? –

+2

I varchar non richiedono effettivamente una lunghezza specificata? – sleblanc