2012-09-22 37 views
10

Tôi đang cố gắng tìm độ dài tối đa của số nhận dạng múi giờ. Đây là chuỗi được sử dụng làm tên múi giờ (ví dụ: "America/New_York"). Cơ sở dữ liệu tz không hữu ích; Tôi không thể tìm thấy chi tiết triển khai.Độ dài tối đa của tên "trường tzname"/tên định danh múi giờ

Microsoft (.NET Framework 4.5) suggests a max length of 32, nhưng điều này có vẻ là một hạn chế trong sổ đăng ký của họ.

libc points to a limit called "_POSIX_TZNAME_MAX", which is 3 characters long, nhưng đây là yêu cầu tối thiểu tuyệt đối để tuân thủ POSIX. Thông thường, tôi đoán việc triển khai sẽ sử dụng nhiều hơn.

Vì vậy, câu hỏi thực sự là: Độ dài chuỗi có thể chấp nhận để lưu trữ an toàn múi giờ "tên tzname"/tên định danh là gì?

Trả lời

18

Tại sao không sử dụng vùng chứa không quan tâm độ dài là gì - ví dụ: std::string? Bây giờ, nó như vậy xảy ra rằng tôi đã làm việc gần đây với db TZ như được cung cấp ở định dạng csv phổ biến (ví dụ ở đây in a file from CERN) nhưng định dạng tương tự cũng được sử dụng trong các nguồn Tăng cường.

Với dữ liệu đó, tôi nhìn thấy một chiều dài tối đa 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> 

Chúng tôi cũng có thể nhìn vào một biểu đồ:

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

enter image description here

này sử dụng mã mà tôi có trong gói RcppBDT của tôi là SVN repo on R-Forge nhưng chưa nằm trong gói CRAN version của gói.

+2

Câu trả lời tuyệt vời! Trên thực tế, tôi không thể sử dụng chuỗi độ dài biến vì tôi muốn lưu trữ các chuỗi đó trong cơ sở dữ liệu. Lúc đầu, tôi không muốn sử dụng một trường char tùy ý, nhưng tôi nghĩ rằng tôi được đặt trên một chuỗi dài 40 ký tự [1]. Tôi sẽ đặt chúng trong một bảng riêng biệt và tham khảo chúng bằng cách sử dụng các phím nước ngoài. 1: Có múi giờ ("America/Argentina/ComodRivadavia") thực sự dài 32-char. Trong tương lai có thể có những cái tên dài khác. – sleblanc

+0

Bạn không thể sử dụng varchar trong SQL? –

+2

Không varchars thực sự đòi hỏi một chiều dài quy định? – sleblanc

Các vấn đề liên quan