2014-11-12 3 views
3

Я хотел бы проверить, является ли переменная датой (не проблема), но если переменная имеет правильный формат даты (yyyy-MM-dd).Тест, если переменная - дата с правильным форматом

Я пробовал:

export DATE_REFRESH=01/01/1900 

if ! date -d $DATE_REFRESH "+%Y-%m-%d"; then 
    echo "$DATE_REFRESH is not a valid date. Expected format is : yyyy-MM-dd" 
fi 

Но это не работает.

я могу попробовать с этим:

if [[ $DATE_REFRESH == [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9] ]] 

Но я не хочу иметь дату на 33/19/2000 ...

+0

Какие все форматы даты, которые вы пытаетесь проверить? – anubhava

+0

@anubhava Только «yyyy-MM-dd» ;-) – BnJ

+1

Хм, но ваш вопрос показывает значение '01/01/1900' в качестве входного сигнала – anubhava

ответ

4

Вы можете использовать этот фрагмент:

isValidDate() { 
    if [[ "$1" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1">/dev/null 2>&1; then 
     echo "valid" 
    else 
     echo "invalid" 
    fi; 
} 

Тестирование:

isValidDate "1900-12-25" 
valid 

isValidDate "1900-14-25" 
invalid 

isValidDate "01/01/1900" 
invalid 
2

Вы должны сделать оба теста, поскольку date строка может быть все, что видите:

справочную страницу

В --date = STRING представляет собой главным образом свободный формат для чтения человеком дата строки, такие как ...

Использование что:

if ! [[ "$DATE_REFRESH" =~ ^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}$ ]] \ 
|| ! date -d $DATE_REFRESH >/dev/null 2>&1; then 
    echo "$DATE_REFRESH is not a valid date. Expected format is : yyyy-MM-dd" 
fi 
Смежные вопросы