添加月份會妨礙基本算術,因為連續月份的長度不同。與其他元素一起,有助於算術執行自動翻轉。例如,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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。