获取特定时区的当前时间

7
我有一个包含不同时区日期和时间格式的数据框,我想要将它与该时区的当前时间进行比较。所以我想将以下“日期和时间”列加1小时,然后将其与该时区的当前时间进行比较,例如第一个(时区为EDT,当前时间为2017-07-18 10:20 EDT)。
     Date and time   TZ
   2017-07-08 16:00  EDT

   2017-07-17 15:30  PDT

   2017-07-17 11:00  EDT

   2017-07-17 20:00  EDT

   2017-07-17 10:00  EDT

   2017-07-13 15:00  PDT

EDT代表“美国/纽约”时区,PDT代表太平洋时区。我只有原始数据中的时间信息,后来通过城市名称创建了一列来确定是“EDT或PDT”,但我不确定该如何继续下一步操作。我在这个time zone not changing when specified网页上尝试了一些内容。

时区问题真的很棘手,我的系统默认为“美国/纽约”时区,我不确定我尝试的任何方法是否正确。

请问有人能提供一些如何在一列中获取本地时间的想法吗?

我的期望输出结果是:

    Date and time  |  TZ | Localtime(current)

  2017-07-08 16:00 | EDT | 2017-07-17  2017-07-18 10:24:19 EDT

  2017-07-17 15:30 | PDT | 2017-07-17  2017-07-18 09:25:19 PDT

  2017-07-17 11:00 | CDT | 2017-07-17  2017-07-18 09:25:19 CDT

  2017-07-17 20:00 | EDT | 2017-07-17  2017-07-18 23:02:19 EDT

  2017-07-17 10:00 | EDT | 2017-07-17  2017-07-18 10:24:19 EDT

  2017-07-13 15:00 | PDT | 2017-07-17  2017-07-18 09:25:19 PDT

1
我强烈建议在这种类型的转换中使用lubridate https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html - Andrew Brēza
9
lubridate::with_tz(Sys.time(), "UTC")将给出当前时间的本地时间为UTC - d.b
@d.b 谢谢,但我不想将时区更改为UTC。 - KKY
2个回答

2
library(lubridate)
currentTime <- Sys.time()
tzs <- c("America/Los_Angeles", "America/Chicago", "America/New_York")
names(tzs) <- c("PDT", "CDT", "EDT")
lapply(tzs[data$TZ], with_tz, time = currentTime)

建议使用lubridate中的with_tz,然后循环处理。


谢谢,这确实提供了不同城市的当前时区。很抱歉问一下,我应该在哪里输入我的数据? - KKY
1
你可以使用 OlsonNames() 查找时区之间的匹配。我已经更新了我的回答。 - troh

1
如果您不想/不需要使用lubridate,那么使用@troh答案中的tzscurrentTime对象可以得到相同的结果:
Map(`attr<-`, currentTime, "tzone", tzs[dat$TZ])

@thelateemail,这个脚本给我输出了一些像"1500447303.06667"这样的内容,它不是时间格式。我尝试使用anytime来处理,但它没有起作用。我还尝试使用as.character来改变类型,但输出结果仍然相同。 - KKY
@kky - 我刚再次检查了一下,它并没有这样。它会给出一个POSIXct时间的列表,在各种时区中都相同,与接受的答案相同。如果您尝试对其进行unlist操作,它将返回自1970-01-01以来的秒数的数字表示,这就是POSIXct所表示的内容。向量只能有一个时区关联,因此您最好像这样格式化您的时间 - sapply(Map(\attr<-`, currentTime, "tzone", tzs[dat$TZ]), format)`。 - thelatemail
@thelateemail,它给我一个错误Error: unexpected input in "fgfg1$h<-sapply(Map(attr<-`, currentTime, "tzone", tzs[df$col]) %b %d %Y %H:%M)"。此外:有50个或更多警告(使用warnings()查看前50��)。请指出我的错误并纠正它。 - KKY
@kky - 问题出在你添加的未引用的 %b %d %Y %H:%M。这不在我提供的代码示例中。首先需要将日期时间变量设置为正确的日期时间,如果第一次获得 1500447303.06667 这样的输出,那么你以前显然已经做到了。按照 @troh 的答案中的每个部分进行步骤,只需将他的最后一行替换为我上面的一行即可。 - thelatemail
是的,我尝试过了,但它会给我所有具有相同时间的行,例如:“2017-07-20 01:37:55”。 - KKY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接