Как проверить, находится ли введенная дата в формате гггг / мм / дд? - PullRequest
1 голос
/ 07 мая 2019

При вводе в моем коде запрашивается дата, которую я хочу, чтобы пользователь ввел в виде гггг / мм / дд.После того, как дата введена, я хочу проверить, действительно ли дата в этом формате, и если нет, пользователю будет предложено ввести дату снова.

Я нашел функцию, которая должна проверить это здесь: https://gist.github.com/micstr/69a64fbd0f5635094a53

Однако, когда я добавил эту функцию в свой код и ввел неправильный формат даты («2016/18/24»)возвращение этой функции было не ЛОЖЬ, а ИСТИНА.

Вот код:

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)

Как мне настроить свой код так, чтобы он решал мою проблему?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Не используйте регулярные выражения.Используйте библиотеку дат.Мой любимый разбор дат (и datetime) без строки формата:

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

Так что, если вы получите дату назад, все хорошо.Если вы получили NA, возникла проблема.

1 голос
/ 07 мая 2019

Может, вместо этого использовать пакет 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

...