【问题标题】:Does lubridate really register leap seconds?lubridate 真的记录闰秒吗?
【发布时间】:2022-02-03 17:24:57
【问题描述】:

我正在查看 R 包lubridate。我正在比较它的功能days()ddays()。根据维基百科和全局变量.leap.seconds,在 1997/06/30 和 1997/07/01 之间有一个闰秒。因此,我期待

ymd_hms("19970630 02:13:01", tz="GMT") + days(2) == ymd_hms("19970630 02:13:01", tz="GMT") + ddays(2)

为 FALSE,因为 days(x) 仅将天数增加 x,而 ddays(x) 将秒数增加 86400x。但是,上面的语句返回 TRUE。我错过了什么?

【问题讨论】:

  • 尽管导出了.leap.seconds,R 忽略了日期时间算法中的闰秒以匹配 POSIX 标准。您不能定义代表时间1997-06-30 23:59:60POSIXct 对象,即使该时间由于闰秒而“发生”。在?DateTimeClasses中有解释。
  • 谢谢你的回复,有道理。然后我真的不明白为什么lubridate 会在days()ddays() 之间产生差异。那么这不应该在每种情况下都相同吗?
  • ddays 根据我的经验,在切换到夏令时时会有所不同。
  • 我建议研究lubridate 如何定义以下三个timespan classesdurationintervalperioddays 返回一个指定不精确持续时间的 period 对象。 ddays 返回一个精确持续时间的 duration 对象。
  • ddays 反映了我们对“实时”一天的理解为 86400 秒。 days 反映了我们对一天的理解,即从今天中午到明天中午的时间,但由于夏令时(@Sandwichnick 指出)和闰,这可能比“实时”多或少 86400 秒秒。

标签: r time lubridate


【解决方案1】:

详细阐述 Mikael Jagan 和 Sandwichnick 的答案,我得出以下结论:

lubridate 忽略闰秒以匹配 POSIX 时间标准。因此,days()ddays() 在闰二日(例如 1997 年 6 月 30 日)提供相同的结果。

> ymd_hms("19970630 02:13:01", tz = "UTC")+ddays(2) 
[1] "1997-07-02 02:13:01 UTC"
> ymd_hms("19970630 02:13:01", tz = "UTC")+days(2) 
[1] "1997-07-02 02:13:01 UTC"

但是,lubridate 确实记录了夏令时,因此 days()ddays() 在这种情况下确实有所不同,如下例所示:

> ymd_hms("20211030 14:45:06", tz = "Europe/Berlin")+days(1)
[1] "2021-10-31 14:45:06 CET"
> ymd_hms("20211030 14:45:06", tz = "Europe/Berlin")+ddays(1)
[1] "2021-10-31 13:45:06 CET"

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2015-09-18
    相关资源
    最近更新 更多