执行此操作的安全方法是将日期值传递给format
. 这确实创建了一个额外的步骤,但as.Date
如果它是用“-”或“/”格式化的,则将接受字符结果:
as.Date( format( as.POSIXct('2019-03-11 23:59:59'), "%Y-%m-%d") )
[1] "2019-03-11"
as.Date( as.POSIXct('2019-03-11 23:59:59') ) # I'm in a locale where the problem might exist
[1] "2019-03-12"
时区的文档也让我感到困惑。在某些情况下(事实证明在这种情况下),EST 可能并不明确,实际上可能指的是澳大利亚的 tz。如果您碰巧在北美,请尝试“EST5EDT”或“America/New_York”。
在这种情况下,它还可能与您未说明的操作系统如何处理“tz”参数的差异有关,因为我得到“2012-08-06”。(我目前在 PDT US tz 中,尽管我不确定这是否重要。)更改获取 tz 参数的函数可能会澄清(或不澄清):
> as.Date(as.POSIXct('2012-08-06 19:35:23', tz='EST'))
[1] "2012-08-07"
> as.Date(as.POSIXct('2012-08-06 17:35:23', tz='EST'))
[1] "2012-08-06"
> as.Date(as.POSIXct('2012-08-06 21:35:23'), tz='EST')
[1] "2012-08-06"
> as.Date(as.POSIXct('2012-08-06 22:35:23'), tz='EST')
[1] "2012-08-07"
如果您省略 tz,as.POSIXct
则假定为 UTC。
这些是 Ozzie TZ 的明确名称(至少在我的 Mac 上):
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 = "#")
grep("^Aus", tzones$name, value=TRUE)
[1] "Australia/Lord_Howe" "Australia/Hobart"
[3] "Australia/Currie" "Australia/Melbourne"
[5] "Australia/Sydney" "Australia/Broken_Hill"
[7] "Australia/Brisbane" "Australia/Lindeman"
[9] "Australia/Adelaide" "Australia/Darwin"
[11] "Australia/Perth" "Australia/Eucla"