入力日付形式が正しいことを確認する必要がある(mmddyyyy)

入力日付形式が正しいことを確認する必要がある(mmddyyyy)

ユーザーが入力した日付(mmddyyyy)を確認しようとしています。以下を使用しましたが、動作しません。間違いを修正してください。

 date  "+%m%d%Y" -d "02012019" > /dev/null  2>&1
        echo $?

答え1

そしてzsh

#! /bin/zsh -
date=${1?No date specified}

zmodload zsh/datetime || exit
if
  strftime -rs t %m%d%Y "$date" 2> /dev/null &&
  strftime -s canonical_date_for_t %m%d%Y "$t" 2> /dev/null &&
  [[ $date = $canonical_date_for_t ]]
then
  print -r -- $date is valid
else
  print -ru2 -- ${(q+)date} is invalid
  exit 1
fi

strftime -r解析された入力に基づいて呼び出されますstrptime()。フォーマットされた日付に戻る変換を使用せずに。$date%m%d%Ystrftime-r%m%d%Ystrftime()

strptime()aを受け入れて02292019として処理します03012019が、一度キャストすると拒否されstrftime()ます03012019。同様に12310001、(0001-12-31)は期待どおりに拒否されます12311%Y1年目のACではなく1;0001必要%Yに応じて次に置き換えます)。%4Ystrftime0001予想される年表示1)。

答え2

私が正しく理解した場合、これは可能なアプローチの1つです。

#!/bin/bash

d="$1"

[[ ! "$d" =~ ^[0-9]{8}$ ]] && \
  echo "Illegal number of characters, or not numbers." && \
  exit

d="${d:4}${d:2:2}${d:0:2}"

date  "+%m%d%Y" -d"$d" > /dev/null 2>&1

[ $? -ne 0 ] && echo "Invalid date." || echo "Valid date."

$ ./xx.sh 0201201x
Illegal number of characters, or not numbers.
$ ./xx.sh 0201201900000
Illegal number of characters, or not numbers.
$ ./xx.sh 32022019
Invalid date
$ ./xx.sh 02022019
Valid date.

これで01022019有効な日付になりますが、ユーザーが最初に日付を入力してから月を入力すると、特定の要件に合った別の検証セットが必要です。

関連情報