【问题标题】:System date in Posixlt and PosixctPosixlt 和 Posixct 中的系统日期
【发布时间】:2018-06-22 17:12:41
【问题描述】:

我正在尝试在 Posix 时间使用 Sys.Date() 获得昨天的最后一分钟。

force_tz(as.POSIXlt(Sys.Date()-1), tz = 'America/New_York') + 86399
# [1] "2018-01-12 23:59:59 EST" 

正确

force_tz(as.POSIXct(Sys.Date()-1), tz = 'America/New_York') + 86399
# [1] "2018-01-12 15:59:59 EST"

不正确

Sys.Date()
# [1] "2018-01-13"

为什么 as.Posixctas.Posixlt 使用 Sys.Date() 返回两个不同的值,为什么即使在从 lubridate 应用 force_tz 后 8 小时也有差异?

【问题讨论】:

    标签: r time posix lubridate


    【解决方案1】:

    一如既往,debugonce 是您的朋友。运行debugonce(force_tz),您可以看到输出的差异来自force_tz首先点击分支检查is.POSIXct(time)(在这种情况下应用默认tzone = "");在POSIXlt 的情况下,默认分支被命中,其中as.POSIXct 应用于timetz(time)(对于UTC 对象出现UTC)用作时区。


    这归结为发生了一些微妙的事情;来自?as.POSIXlt.Date

    没有时间的日期被视为 UTC 午夜。

    因此

    tz(as.POSIXlt(Sys.Date()-1))
    # [1] "UTC"
    

    但是

    tz(as.POSIXct(Sys.Date()-1))
    # [1] ""
    

    特别之处在于它不能被覆盖——as.POSIXlt.Date 不接受 tz 参数:

    formals(as.POSIXlt.Date)
    # $x
    # $...
    

    如果你想使用POSIXct,下面的呢?

    force_tz(as.POSIXct(sprintf('%s 00:00:00', Sys.Date())), 'America/New_York') - 1L
    # [1] "2018-01-12 23:59:59 EST"
    

    【讨论】:

    • @the_darkside 我终于满意我的回答涵盖了您的问题;如果我错过了什么,请跟进
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 2017-11-30
    • 2018-02-04
    • 2016-10-07
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多