【问题标题】:Converting incorrect timezone转换不正确的时区
【发布时间】:2017-06-20 07:15:02
【问题描述】:

我有一个 POSIXct 变量,读取时间为 2016-12-15 20:11:29 PST,但 PST 不正确。它实际上应该是 2016-12-15 20:11:29 GMT

我需要使时区正确,格林威治标准时间,然后我需要将其转换为纽约时间

所以我得到了 2016-12-15 20:11:29 PST。它真的应该是 2016-12-15 20:11:29 GMT 然后我需要将 2016-12-15 20:11:29 GMT 转换为“America/New_York”所以最终结果将是 16:11:29 America/ New_York,因为纽约时间比格林威治标准时间晚。

我已经尝试了很多方法,但无法让它发挥作用。有什么想法吗?

 p = as.POSIXct("2016-12-15 20:11:29 PST")
 p

********** 更新 ********* 我的真实代码使用变量,建议的解决方案不起作用。见下文

     p = as.POSIXct("2016-12-15 20:11:29 PST")
          out = as.POSIXct(p, tz="GMT")
          out
          attr(out,"tzone") <- "America/New_York"
          out

>           out
[1] "2016-12-15 20:11:29 PST"
>           attr(out,"tzone") <- "America/New_York"
>           out
[1] "2016-12-15 23:11:29 EST"  ### this is incorrect

*** 这也不起作用

 p = as.POSIXct(p, usetz=TRUE, tz="GMT")
      (format(p, tz="America/New_York") )

[1] "2016-12-15 23:11:29 EST"
> p = as.POSIXct(p, usetz=TRUE, tz="GMT")
>           (format(p, tz="America/New_York") )
[1] "2016-12-15 23:11:29"

【问题讨论】:

    标签: r datetime timezone


    【解决方案1】:

    我可以让你大部分时间到达那里,但 R 认为你对时差的看法是错误的:

    > p = as.POSIXct("2016-12-15 20:11:29 PST", usetz=TRUE, tz="GMT")
    >  p
    [1] "2016-12-15 20:11:29 GMT"
    > (format(p, tz="America/New_York") )
    [1] "2016-12-15 15:11:29"
    

    回复编辑。我没有看到问题。 R 中时间的数字表示始终为 GMT。您可以使用参数在输入处执行操作以清除错误的 tz,但随后使用 formatstrftime 的输出将只需要为不同的时区指定一个参数。 (使用变量应该没有效果。)

     p = "2016-12-15 20:11:29 PST"
     pp = as.POSIXct(p, usetz=TRUE, tz="GMT")
     pp
    [1] "2016-12-15 20:11:29 GMT"
    

    【讨论】:

    • out &lt;- as.POSIXct("2016-12-15 20:11:29 PST", tz="GMT"); attr(out,"tzone") &lt;- "America/New_York" 如果您想保留 POSIXct 结构但更改时区。但我同意结果是 15:11:29
    • 我看到这在您的代码中有效,但在我的真实代码中,我有一个变量 var,而不是字符串日期。所以它看起来像 as.POSIXct(var, usetz=TRUE, tz="GMT") 并且它不起作用。我会尝试重现和更新问题
    【解决方案2】:

    您的问题是您的p 默认处于您的系统时区:

    p = as.POSIXct("2016-12-15 20:11:29 PST")
    p
    # I'm in Australian Eastern Standard Time, AEST
    #[1] "2016-12-15 20:11:29 AEST"
    as.numeric(p)
    #[1] 1481796689
    

    将此本地日期时间转换为 UTC,这会更改基础数据,方法是格式化并将时区重置为 GMT(除非您已经在 GMT,那么它当然不会执行任何操作):

    p2 <- as.POSIXct(format(p),tz="UTC")
    p2
    #[1] "2016-12-15 20:11:29 UTC"
    as.numeric(p2)
    #[1] 1481832689
    p2 - p
    #Time difference of 10 hours
    # ...which is the difference between AEST and GMT
    

    然后您可以调整 timezone 属性,这只会改变日期/时间对象的显示。它不会影响基础数值数据:

    attr(p2,"tzone") <- "America/New_York"
    p2
    #[1] "2016-12-15 15:11:29 EST"
    
    as.numeric(p2)
    #[1] 1481832689
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 2011-07-06
      • 2011-07-02
      • 2014-04-09
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      相关资源
      最近更新 更多