Data de validação no shell

14

Eu quero validar o formato de data abaixo no script de shell

2015-Jul-13

Estou usando date -d "2015-Jul-13" +"%Y-%b-%d" , mas seu erro de geração é

date: invalid date '2015-Jul-13'
    
por chhaya vishwakarma 13.07.2015 / 12:36

3 respostas

12

O GNU date não suporta YYYY-MMM-DD . No entanto, ele entende DD-MMM-YYYY . Então, se você realmente tem que lidar com datas deste formato, pode fazê-lo com algo como isso, que simplesmente troca os argumentos por um formato que date espera:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

Aqui está uma solução totalmente shell. Quebrando-o, as instruções IFS=- dizem ao shell para dividir uma linha de comando próxima por hífen - em vez de espaço em branco. O set $ymd analisa a variável $ymd como para uma linha de comando, mas agora divide por hífen, atribuindo valores aos parâmetros $1 , $2 e seq . O echo "$3-$2-$1" envia trivialmente os três valores capturados em ordem inversa.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
    
por 13.07.2015 / 14:46
11

Da página de manual: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

Mas parece que não reconhece YYYY-MMM-DD format. Então, você pode usar de baixo ou semelhante:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

OU você tem que converter / reformule antes de enviar para date !

Veja também Como você especifica um formato para a entrada até a data?

Recomendo visitar: Formatos de entrada de dados .

Here are the rules.

For numeric months, the ISO 8601 format 'year-month-day' is allowed, where year is any positive number, month is a number between 01 and 12, and day is a number between 01 and 31. A leading zero must be present if a number is less than ten. If year is 68 or smaller, then 2000 is added to it; otherwise, if year is less than 100, then 1900 is added to it. The construct 'month/day/year', popular in the United States, is accepted. Also 'month/day', omitting the year.

Literal months may be spelled out in full: 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November' or 'December'. Literal months may be abbreviated to their first three letters, possibly followed by an abbreviating dot. It is also permitted to write 'Sept' instead of 'September'.

When months are written literally, the calendar date may be given as any of the following:

 day month year
 day month
 month day year
 day-month-year

enfatizado por mim

Aqui você pode ver que não há formato como ano-mês-dia ! (durante meses estão escritos literalmente)

    
por 13.07.2015 / 14:53
7

Com zsh você pode usar o strftime incorporado (disponível via zsh/datetime ) com -r (reverso):

strftime -r format timestring

que usa o formato para analisar o timestring e produzir o número de segundos desde epoch:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

Isso elimina erros se a data for inválida:

strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5: format not matched

Você também pode converter os segundos desde a época para qualquer outro formato de data padrão / personalizado, por exemplo,

strftime '%A, %B %d, %Y' 1447970400
Friday, November 20, 2015
    
por 13.07.2015 / 15:41