R:检查日期是否有效

时间:2020-06-18 02:31:01

标签: r date

假设日期指定为三个整数:年,月,日

年份是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)
    }

3 个答案:

答案 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)