R中的时区转换是否给出了正确的值?

时间:2016-01-15 01:39:41

标签: r timezone posixct

为了进行健全性检查,我想看看在从DST到ST的过渡时间之后几分钟,是否会给出相同的东部时间和UTC的相同小时。 在加拿大,11月的第一个星期日时间从凌晨2:00变为凌晨1:00。 为简单起见,我只关注2012年至2016年的1个时区。

以下是我的代码,它也会重现数据:

require(timeDate)
timezones <- data.frame(TZname=rep(c('America/Vancouver'),each=5))
timezones$TZname <- as.character(timezones$TZname)
timezones$DST_end <- paste(as.character(timeNthNdayInMonth(paste0(as.character(2012:2016), '-11-01'), nday=0, nth=1)), '1:00')

# initialize a column
timezones$ET_DST_end <- .POSIXct(integer(nrow(timezones)))
for (i in 1:nrow(timezones)) {

        timezones$ET_DST_end[i] <- as.POSIXct(timezones$DST_end[i], tz=timezones$TZname[i])
}
timezones$UTC_DST_end <- format(timezones$ET_DST_end, tz='UTC')

dput(timezones)
# Below is the result

structure(list(TZname = c("America/Vancouver", "America/Vancouver", 
"America/Vancouver", "America/Vancouver", "America/Vancouver"
), DST_end = c("2012-11-04 1:00", "2013-11-03 1:00", "2014-11-02 1:00", 
"2015-11-01 1:00", "2016-11-06 1:00"), ET_DST_end = structure(c(1352016000, 
1383465600, 1414915200, 1446364800, 1478419200), class = c("POSIXct", 
"POSIXt")), UTC_DST_end = c("2012-11-04 08:00:00", "2013-11-03 08:00:00", 
"2014-11-02 08:00:00", "2015-11-01 08:00:00", "2016-11-06 08:00:00"
)), .Names = c("TZname", "DST_end", "ET_DST_end", "UTC_DST_end"
), row.names = c(NA, -5L), class = "data.frame")

如果我在第三行中将值1:00更改为1:07,则输出的最后2列将在2012年向前移动一小时。 sessionInfo()的输出是:

R version 3.2.0 (2015-04-16)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.1 (unknown)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] timeDate_3012.100

loaded via a namespace (and not attached):
[1] tools_3.2.0

Q1:为什么会这样?

Q2:这是否意味着时区转换不准确?

问题3:自1:00 AM + 8 = 9:00 AM以来,UTC小时是否应为9而不是8?

由于

1 个答案:

答案 0 :(得分:0)

我无法使用您的代码重现您的结果,但无论如何这可能会有所帮助。类POSIXct的向量(POSIXlt的相同)只能有一个时区。

x <- as.POSIXct(c("2015-01-01", "2016-01-01"), tz = "GMT")
str(unclass(x))
# atomic [1:2] 1.42e+09 1.45e+09
# - attr(*, "tzone")= chr "GMT"
as.POSIXct("2015-01-01", tz = "America/Los_Angeles")
#[1] "2015-01-01 PST"
x[1] <- as.POSIXct("2015-01-01", tz = "America/Los_Angeles")
str(unclass(x))
# atomic [1:2] 1.42e+09 1.45e+09
# - attr(*, "tzone")= chr "GMT"

以下是[<-.POSIXct的源代码:

function (x, ..., value) 
{
    if (!length(value)) 
        return(x)
    value <- unclass(as.POSIXct(value))
    cl <- oldClass(x)
    tz <- attr(x, "tzone")
    class(x) <- NULL
    x <- NextMethod(.Generic)
    class(x) <- cl
    attr(x, "tzone") <- tz
    x
}

如您所见,功能:

  1. 删除RHS向量的类,
  2. 复制LHS向量的类和时区属性
  3. 删除LHS向量的类,
  4. 使用默认的[<-方法
  5. 恢复存储的类和时区。
  6. 因此,[<-无法更改POSIXct向量的时区。