R 将时区偏移量添加到 POSIXct 类

标签 r timezone-offset

是否有一种简单的方法可以将时区偏移量添加到现有时间戳(全部采用 UTC)?

为简单起见,我使用 Sys.time()在我的示例中,但在实际数据中,我做 DF$ts <- as.POSIXct(..., tz="GMT") .

DF <- data.frame("ts" = rep(Sys.time(), 5),
                 "offset"=c("-11:00", "-12:00", "+01:30", "+02:00", "+02:30"))

# > DF
#                    ts offset
# 1 2015-09-02 14:35:31 -11:00
# 2 2015-09-02 14:35:31 -12:00
# 3 2015-09-02 14:35:31 +01:30
# 4 2015-09-02 14:35:31 +02:00
# 5 2015-09-02 14:35:31 +02:30

现在我正在进行字符串操作,但我认为这并不优雅。例如,

offsetSeconds <- function(offset) {
  time <- as.numeric(strsplit(offset, ":")[[1]])
  seconds <- time[1] * 3600 + sign(time[1]) * time[2] * 60
  return(seconds)
}
DF$seconds <- as.numeric(sapply(as.character(DF$offset), offsetSeconds))
DF$local_ts <- DF$ts + DF$seconds

# > DF
#                    ts offset seconds            local_ts
# 1 2015-09-02 14:35:31 -11:00  -39600 2015-09-02 03:35:31
# 2 2015-09-02 14:35:31 -12:00  -43200 2015-09-02 02:35:31
# 3 2015-09-02 14:35:31 +01:30    5400 2015-09-02 16:05:31
# 4 2015-09-02 14:35:31 +02:00    7200 2015-09-02 16:35:31
# 5 2015-09-02 14:35:31 +02:30    9000 2015-09-02 17:05:31

最佳答案

library(lubridate)
signs <- as.numeric(paste0(substr(DF$offset, 1, 1), "1"))
DF$ts + hm(DF$offset)*signs
#[1] "2015-09-02 04:06:17 EDT" "2015-09-02 03:06:17 EDT"
#[3] "2015-09-02 16:36:17 EDT" "2015-09-02 17:06:17 EDT"
#[5] "2015-09-02 17:36:17 EDT"

使用 lubridate 包中的函数 hm,我们可以将 offset 列中的文本字符串转换为小时和分钟范围。但是由于函数忽略了正负号,我们必须将小时/分钟变量乘以符号。我假设,如示例中所示,每个偏移量都有一个正号或负号。

关于R 将时区偏移量添加到 POSIXct 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360948/

相关文章:

javascript - 服务器端和客户端的时区偏移量不同

java - Android - junit - 单元测试 - 带时区的 SimpleDateFormat

javascript - Google 脚本日期显示错误 "hours"

arrays - 如何在 R 中传递一堆元素作为参数?

python - Python 和 R 词汇表的比较

r - 高效找到集合差异并生成随机样本

javascript - 如何检查 DST(夏令时)是否有效,如果有效,偏移量?

linux - R 手册在 linux mint 17.1 中无法以离线模式打开

r - 为geom_vline添加单独的图例

c# - DateTimeOffset 解析和自定义时区