Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何检查输入的日期是否为yyyy/mm/dd格式?_R_Date_Lubridate - Fatal编程技术网

R 如何检查输入的日期是否为yyyy/mm/dd格式?

R 如何检查输入的日期是否为yyyy/mm/dd格式?,r,date,lubridate,R,Date,Lubridate,我的代码中的一个输入要求输入一个日期,我希望用户以yyyy/mm/dd的形式输入。输入日期后,我希望检查该日期是否为该格式,如果不是,将要求用户再次输入该日期 我找到了一个函数,可以在这里检查: 然而,当我将此函数添加到代码中并输入错误的日期格式(“2016/18/24”)时,此函数的返回值不是FALSE而是TRUE 代码如下: library(lubridate) IsDate <- function(mydate) { tryCatch(!is.na(as.Date(mydate,

我的代码中的一个输入要求输入一个日期,我希望用户以yyyy/mm/dd的形式输入。输入日期后,我希望检查该日期是否为该格式,如果不是,将要求用户再次输入该日期

我找到了一个函数,可以在这里检查:

然而,当我将此函数添加到代码中并输入错误的日期格式(“2016/18/24”)时,此函数的返回值不是FALSE而是TRUE

代码如下:

library(lubridate)
IsDate <- function(mydate) {
  tryCatch(!is.na(as.Date(mydate, "",tryFormats = "%Y/%m/%d")),  
           error = function(err) {FALSE})  
}

date1<- readline("Enter date (Format: yyyy/mm/dd):")

check <- IsDate(date1)
while(check == FALSE){
  otp_date <- readline("Date in wrong format. Enter again:")
  check <- IsDate(date1)
}
date1<- as.Date(date1)
库(lubridate)

IsDate是否可以使用
chron
-包


IsDate <- function(mydate) {
  tryCatch(!is.na(suppressWarnings(chron(mydate, format = "y/m/d"))),  
           error = function(err) {FALSE})  
}

> IsDate("02/02/2016")
[1] FALSE

> IsDate("2016/18/24")
[1] FALSE

> IsDate("2019/10/03")
[1] TRUE


IsDate IsDate(“2016年2月2日”)
[1] 假的
>IsDate(“2016/18/24”)
[1] 假的
>IsDate(“2019/10/03”)
[1] 真的

不要使用正则表达式。使用日期库。我最喜欢的解析日期(和日期时间),无需格式字符串:

R> library(anytime)
R> anydate("2016/18/24")
[1] NA
R> anydate("2016/08/24")
[1] "2016-08-24"
R> 

所以,如果你有个约会,一切都很好。如果您得到NA,则会出现问题。

下面是一个矢量化的base R函数,该函数可与NA一起使用,并且对SQL注入是安全的:

is_date = function(x, format = NULL) {
  formatted = try(as.Date(x, format), silent = TRUE)
  is_date = as.character(formatted) == x & !is.na(formatted)  # valid and identical to input
  is_date[is.na(x)] = NA  # Insert NA for NA in x
  return(is_date)
}
让我们试试:

> is_date(c("2020-08-11", "2020-13-32", "2020-08-11; DROP * FROM table", NA), format = "%Y-%m-%d")
## TRUE FALSE FALSE    NA

你好请您再解释一下,即为什么您认为您输入的格式“错误”?好的,谢谢!现在,当我输入错误的月份/天时,它可以工作。但是,如果我输入例如
02/02/2016
我会得到
TRUE
,尽管格式不是YYYY/MM/DD。我可以强制输入错误的日期为正确的格式,或者调整函数,使其一开始不会返回
TRUE
?非常感谢您的帮助!现在一切正常!