为了进行健全性检查,我想看看在从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?
由于
答案 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
}
如您所见,功能:
[<-
方法因此,[<-
无法更改POSIXct
向量的时区。