R用时区围绕日期

时间:2017-04-12 13:01:05

标签: r datetime

timestamp = 1491800340000

我在R中遇到一些日期操作有问题。上面的时间戳是:

2017-04-10T04:59:00.000 GMT
2017-04-09T23:59:00.000 America/Bogota (Local time)

我希望将其四舍五入为2017-04-09T00:00:00.000 GMT,因为我的每日汇总设置为格林尼治标准时间00:00。

我该怎么做? 这是我试过的:

> Sys.timezone()
  [1] "America/Bogota"
> timestamp = 1491800340000
> date = strptime(timestamp / 1000, "%s");
  [1] "2017-04-09 23:59:00 COT"
> midnightLocal = trunc(date, "day");
  [1] "2017-04-09 COT"
> midnightUTC = strptime(format(midnightLocal, "%Y-%m-%d"), "%Y-%m-%d", tz = "UTC");
  [1] "2017-04-09 UTC"
> truncatedtimestamp = as.integer(format(midnightUTC, "%s"));
  [1] 1491714000

2017-04-09T05:00:00.000 GMT(不是我预期的午夜)。看起来我没能在某个地方指定时区?

我尝试了很多东西,比如POSIXct,但没有成功。 任何提示都表示赞赏! 干杯

ps:我不想安装任何软件包

1 个答案:

答案 0 :(得分:3)

一点点诡计:

timestamp = 1491800340000

ts <- as.POSIXct(timestamp / 1000, origin = "1970-01-01 00:00:00 GMT")
ts2 <- as.Date(trunc(ts, "day"))
attr(ts2, "tzone") <- "GMT"
format(ts2, "%Y-%m-%d %H:%M:%S %Z") # to prove it's midnight
# [1] "2017-04-09 00:00:00 UTC"
class(ts2)
# [1] "Date"

从这里你有几个选择:一点蛮力(数字转换)或者更时间友好/安全的方式。

蛮力数字:

ts3a <- as.numeric(ts2) * 60*60*24
ts3a
# [1] 1491696000
as.POSIXct(ts3a, origin = "1970-01-01 00:00:00 GMT", tz = "GMT")
# [1] "2017-04-09 GMT"

时间友好/安全:

ts3b <- as.POSIXct(ts2)
attr(ts3b, "tzone") <- "GMT"
ts3b
# [1] "2017-04-09 GMT"

(因为它们是POSIXct,它只显示日期,因为它是午夜;您可以很容易地证明它是正确的。)