我想创建一个if-else语句,如果当前日期在每个月的15号之后,它将打印今天的日期,否则如果当前日期在每个月的15号之前,它应该打印上个月的日期。我不知道如何在测试表达式的右侧表示当前月的15号,有什么想法吗?
library(lubridate)
ifelse(Sys.Date() > 15TH_OF_THE_MONTH, Sys.Date(), Sys.Date() - months(1))
我们可以这样做
as.numeric(format(Sys.Date(), "%d")) > 15
[1] TRUE
library(lubridate)
ifelse(day(Sys.Date()) > 15, TRUE, FALSE)
[1] TRUE
为了避免大量的强制操作(日期,数字,整数),我们可能需要使用as.POSIXlt
,它允许将时间元素作为整数访问。
today <- as.POSIXlt(Sys.Date())
if (today$mday > 15L) today else {today$mon <- today$mon - 1L; today}
# [1] "2021-09-30 UTC"
today <- as.POSIXlt("2021-09-14", tz='UTC')
if (today$mday > 15L) today else {today$mon <- today$mon - 1L; today}
# [1] "2021-08-14 UTC"
或者,如果你想坚持使用lubridate
library(lubridate)
today <- Sys.Date()
if (day(today) > 15L) today else {month(today) <- month(today) - 1L; today}
# [1] "2021-09-30"
today <- as.Date("2021-09-14")
if (day(today) > 15L) today else {month(today) <- month(today) - 1L; today}
# [1] "2021-08-14"
实际上,这就是lubridate
在引擎盖下所做的。
lubridate:::mday.default
# function (x)
# as.POSIXlt(x, tz = tz(x))$mday