【发布时间】: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:60的POSIXct对象,即使该时间由于闰秒而“发生”。在?DateTimeClasses中有解释。 -
谢谢你的回复,有道理。然后我真的不明白为什么
lubridate会在days()和ddays()之间产生差异。那么这不应该在每种情况下都相同吗? -
ddays根据我的经验,在切换到夏令时时会有所不同。 -
我建议研究
lubridate如何定义以下三个timespan classes:duration、interval和period。days返回一个指定不精确持续时间的period对象。ddays返回一个精确持续时间的duration对象。 -
ddays反映了我们对“实时”一天的理解为 86400 秒。days反映了我们对一天的理解,即从今天中午到明天中午的时间,但由于夏令时(@Sandwichnick 指出)和闰,这可能比“实时”多或少 86400 秒秒。