【问题标题】:Converting time to POSIX after forcing time zone强制时区后将时间转换为 POSIX
【发布时间】:2018-02-06 06:03:22
【问题描述】:

我有时间向量:

library(lubridate)
> test
[1] "2018-01-13 22:23:00 UTC" "2018-01-13 22:23:00 UTC" "2018-01-13 22:23:00 UTC" "2018-01-13 22:23:00 UTC"
[5] "2018-01-13 22:23:00 UTC" "2018-01-13 22:23:00 UTC"

所有类 POSIX:

> class(test)
[1] "POSIXct" "POSIXt" 

但是当我强制转换时区时:

test <- format(force_tz(test, tz = 'UTC'), tz ='America/Los_Angeles', usetz=TRUE)

这也将时间向量强制转换为无法转换回 POSIX 的字符类。

> class(test)
[1] "character"
as.POSIXct(test, format = "%Y-%m-%d HH:MM:SS")
[1] NA NA NA NA NA NA

这可能是什么问题,更改时区和保留 POSIX 类的解决方法是什么?

【问题讨论】:

  • 猜你的格式也有问题format = "%Y-%m-%d %H:%M:%S"
  • 这是什么问题?
  • HH 而不是 %H

标签: r datetime posix lubridate


【解决方案1】:

基于lubridate 的答案使用with_tz

ss <- strptime(test,format = "%Y-%m-%d %H:%M:%S", tz = 'UCT')
lubridate::with_tz(ss, "America/Los_Angeles")

输出:

> test <- "2018-01-13 22:23:00 UTC"
> ss <- strptime(test,format = "%Y-%m-%d %H:%M:%S", tz = 'UCT')
> lubridate::with_tz(ss, "America/Los_Angeles")
[1] "2018-01-13 14:23:00 PST"

请注意,我使用的是 strptime,因为我的输入是文本,但在您的情况下,您可以简单地使用 with_tz

【讨论】:

    【解决方案2】:

    您应该只使用force_tz 而不要通过format 运行结果。 force_tz 进行时区转换,然后format 将其转换为字符:

    converted = force_tz(test, tz ='America/Los_Angeles')
    

    输出:

    > converted
    [1] "2018-01-13 22:23:00 PST" "2018-01-13 22:23:00 PST" 
        "2018-01-13 22:23:00 PST" "2018-01-13 22:23:00 PST"
    > class(converted)
    [1] "POSIXct" "POSIXt" 
    

    如果您需要转换时区(这不是 force_tz 所做的),请使用 with_tz

    > with_tz(test, tz = 'America/Los_Angeles')
    [1] "2018-01-13 14:23:00 PST" "2018-01-13 14:23:00 PST" 
        "2018-01-13 14:23:00 PST" "2018-01-13 14:23:00 PST"
    

    【讨论】:

    • 是的,除非您没有转换为PST - 时间仍在UTC
    • 好的,force_tz 假设显示的时间对于所需的时区已经正确,并且只是设置时区。如果您想在目标时区获得等效时间,则改为 with_tz(test, tz = 'America/Los_Angeles')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2011-05-10
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多