添加月份会妨碍基本算术,因为连续月份的长度不同。与其他元素一起,有助于算术执行自动翻转。例如,12:00:00 + 61 秒变为 12:01:01。然而,人们通常希望这种行为不要在几个月内发生。例如,我们有时需要 1 月 31 日 + 1 个月 = 2 月 28 日,而不是 3 月 3 日。%m+%
执行此类算术。 Date %m+%
months(n) 始终返回 Date 之后第 n 个月的日期。如果新日期通常会溢出到第 n + 1 个月,%m+%
将返回第 n 个月的最后一天 (rollback()
)。 Date %m-%
months(n) 始终返回 Date 之前第 n 个月的日期。
参数
- e1
- e2
-
类 POSIXlt 、 POSIXct 或 Date 的句点或日期时间对象。请注意,e1 和 e2 之一必须是句点,另一个必须是日期时间对象。
- roll_to_first
-
回滚到该月的第一天而不是上个月的最后一天(传递给
rollback()
) - preserve_hms
-
保留相同的小时、分钟和秒信息?如果为 FALSE,新日期将为 00:00:00(传递给
rollback()
)
细节
%m+%
和 %m-%
通过首先添加/减去月份,然后使用较小的单位执行常规算术来处理组件小于一个月的周期。
%m+%
和 %m-%
应谨慎使用,因为它们不是一对一的操作,并且两者的结果将对操作顺序敏感。
例子
jan <- ymd_hms("2010-01-31 03:04:05")
jan + months(1:3) # Feb 31 and April 31 returned as NA
#> [1] NA "2010-03-31 03:04:05 UTC"
#> [3] NA
# NA "2010-03-31 03:04:05 UTC" NA
jan %m+% months(1:3) # No rollover
#> [1] "2010-02-28 03:04:05 UTC" "2010-03-31 03:04:05 UTC"
#> [3] "2010-04-30 03:04:05 UTC"
leap <- ymd("2012-02-29")
"2012-02-29 UTC"
#> [1] "2012-02-29 UTC"
leap %m+% years(1)
#> [1] "2013-02-28"
leap %m+% years(-1)
#> [1] "2011-02-28"
leap %m-% years(1)
#> [1] "2011-02-28"
x <- ymd_hms("2019-01-29 01:02:03")
add_with_rollback(x, months(1))
#> [1] "2019-02-28 01:02:03 UTC"
add_with_rollback(x, months(1), preserve_hms = FALSE)
#> [1] "2019-02-28 UTC"
add_with_rollback(x, months(1), roll_to_first = TRUE)
#> [1] "2019-03-01 01:02:03 UTC"
add_with_rollback(x, months(1), roll_to_first = TRUE, preserve_hms = FALSE)
#> [1] "2019-03-01 UTC"
相关用法
- R lubridate make_difftime 创建一个 difftime 对象。
- R lubridate minute 获取/设置日期时间的分钟部分
- R lubridate month 获取/设置日期时间的月份部分
- R lubridate make_datetime 从数字表示高效创建日期时间
- R lubridate DateTimeUpdate 更改日期对象的组成部分
- R lubridate stamp 基于人性化模板设置日期和时间格式
- R lubridate interval 用于创建和操作 Interval 对象的实用程序
- R lubridate is.difftime x 是 difftime 对象吗?
- R lubridate as_date 将对象转换为日期或日期时间
- R lubridate date 获取/设置日期时间的日期部分
- R lubridate round_date 日期时间对象的舍入、取整和取整方法
- R lubridate is.timespan x 是时间长度吗?
- R lubridate with_tz 获取不同时区的日期时间
- R lubridate cyclic_encoding 日期时间的循环编码
- R lubridate as.interval 将对象更改为间隔
- R lubridate second 获取/设置日期时间的秒部分
- R lubridate quarter 获取日期时间的财政季度和学期
- R lubridate posix_utils 各种 POSIX 实用程序
- R lubridate date_decimal 将小数转换为日期
- R lubridate as.duration 将对象更改为持续时间
- R lubridate hour 获取/设置日期时间的小时部分
- R lubridate duration 创建一个持续时间对象。
- R lubridate leap_year 一年是闰年吗?
- R lubridate local_time 从日期时间向量获取当地时间。
- R lubridate week 获取/设置日期时间的周组成部分
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Add and subtract months to a date without exceeding the last day of the new month。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。