6

我正在阅读一个包含时间戳和时区规范的文件。我希望能够检测该文件上的给定时区是否被 R 识别,并提供我自己的默认值以防它不是。

但是,如果给定一个无效的时区,似乎 as.POSIXct 会默默地回退到 UTC,而我可以捕捉和处理没有错误或警告:

> as.POSIXct("1970-01-01", tz="blah")
[1] "1970-01-01 UTC"

R中检查给定时区是否被识别的“正确”方法是什么?

4

4 回答 4

4

help("time zones")详细解释了很多时区问题,值得一读。

结果会因您的操作系统而异,但会example("time zones")显示您如何读取 zone.tab 文件(如果您的操作系统有)。

tzfile <- "/usr/share/zoneinfo/zone.tab"
tzones <- read.delim(tzfile, row.names = NULL, header = FALSE,
                     col.names = c("country", "coords", "name", "comments"),
                     as.is = TRUE, fill = TRUE, comment.char = "#")
str(tzones$name)
#chr [1:415] "Europe/Andorra" "Asia/Dubai" "Asia/Kabul" "America/Antigua" "America/Anguilla" ...

NROW(tzones)
#[1] 415

head(tzones)
#  country      coords             name comments
#1      AD +4230+00131   Europe/Andorra         
#2      AE +2518+05518       Asia/Dubai         
#3      AF +3431+06912       Asia/Kabul         
#4      AG +1703-06148  America/Antigua         
#5      AI +1812-06304 America/Anguilla         
#6      AL +4120+01950    Europe/Tirane   
于 2013-06-27T19:12:05.923 回答
4

您可以使用具有时区知识的时区库。这是来自 RcppBDT 的 SVN 版本:

R> tz <- new(bdtTz, "America/Chicago")     
R> cat("tz object initialized as:       ", format(tz), "\n")    
tz object initialized as:        America/Chicago   
R>     tzBAD <- new(bdtTz, "blah")     
Error in new_CppObject_xp(fields$.module, fields$.pointer, ...) :    
  Unknown region supplied, no tz object created       
R>  

通常,时区支持取决于操作系统。因此,对于便携式解决方案,您需要从某个地方提供有效时区列表......

对于它的价值,我正在使用来自 Boost 来源的 csv 文件。该时区文件的副本例如在 github 上

于 2013-06-27T14:18:01.443 回答
4

只是偶然发现了这个问题,因为我想弄清楚同样的事情。原来使用以下。把这个留给任何可能偶然发现这个问题的人......

is.valid.timezone <- function(timezone) {
  return(timezone %in% (OlsonNames()))
}
于 2019-12-17T14:52:47.297 回答
1

您还可以使用RmetricspackagetimeDate包来检查时区。

require(timeDate)

timeDate("1970-01-01", zone = "Africa/Dakar")
## [1] [1970-01-01]

timeDate("1970-01-01", zone = "blah")
## Error in .formatFinCenterNum(unclass(ct), zone, type = "any2gmt") : 
##  'blah' is not a valid FinCenter.
于 2013-06-27T14:34:16.387 回答