假设日期指定为三个整数:年,月,日
年份是4位数的整数(例如2020),月份范围是1-12,日期范围是1-31。
我正在寻找一个简单的函数(称为checkdate),该函数可以检查日期是否有效,如果有效,则返回TRUE,否则返回FALSE。
例如,由于2008年是a年,因此checkdate(2008,2,29)将返回TRUE。
另一方面,由于2009年不是a年,因此checkdate(2009,2,29)将返回FALSE。
checkdate(2009,6,31)将返回FALSE,因为6月只有30天。
等等。
更新
根据下面的Dirk的回答,这是一个执行我要求的功能的函数:
checkdate = function(y, m, d) {
#y: A year, not abbreviated to 2 digits.
#m: An integer in the range 1-12.
#d: An integer in the range 1-31.
#Convert to an R Date object.
#If the date is not valid, NA is returned.
dt = as.Date(paste(y, m, d, sep='-'), optional=TRUE)
ifelse(is.na(dt), FALSE, TRUE)
}
答案 0 :(得分:2)
如果输入失败,请尝试将输入转换为日期,返回FALSE
。
checkdate <- function(y, m, d) {
tryCatch(lubridate::is.Date(as.Date(paste(y, m, d, sep = '-'))),
error = function(e) return(FALSE))
}
checkdate(2009, 6, 31)
#[1] FALSE
checkdate(2009, 2, 29)
#[1] FALSE
checkdate(2008, 2, 29)
#[1] TRUE
答案 1 :(得分:0)
好的。只需尝试解析它:
R> days <- 28:31
R> dates <- paste0("2020-02-", days)
R> as.Date(dates)
[1] "2020-02-28" "2020-02-29" NA NA
R>
这表明,到2020年,存在2月28日和29日(le年),但不存在30和31日。
从三个向量中,您可以使用sprintf("%4d-%02d-%02", y, m, d)
创建一个文本输入向量以进行解析。
答案 2 :(得分:0)
使用@Ronak Shah的逻辑为基础R:
checkdate <- function(y, m, d) {
tryCatch(inherits(as.Date(paste(y, m, d, sep = '-')), "Date"),
error = function(e) return(FALSE))
}
checkdate(2015, 12, 31)