シェルの日付検証

シェルの日付検証

シェルスクリプトで次の日付形式を確認したい

2015-Jul-13

使用していますが、date -d "2015-Jul-13" +"%Y-%b-%d"次のようにエラーが発生します。

date: invalid date '2015-Jul-13'

答え1

GNUはこれをdateサポートしていませんYYYY-MMM-DD。したがって、実際にこの形式で日付を処理する必要がある場合は、パラメータを目的の形式DD-MMM-YYYYに置き換える次の方法を使用して処理できます。date

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

これは完全なシェルソリューションです。これを分解すると、IFS=-ディレクティブはシェルに空白ではなく-ハイフンを使用して、次のコマンドラインを区別するように指示します。コマンドラインのように変数を解析しますが、今はハイフンで区切り、set $ymdパラメータに値を割り当て、$ymd$1$2 待つ。キャプチャされた3つの値を逆順echo "$3-$2-$1"に出力するだけです。

ymd='2015-Jul-13'

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

答え2

マンページから:-

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.

YYYY-MMM-DDところでフォーマットを認識できないようです。したがって、次のようなものを使用できます。

$ 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

または変換する必要があります/再フォーマット送る前にただ送ってくださいdate

また見てくださいこれまでの入力形式を指定する方法は?


私は次を訪問することをお勧めします:日付入力形式

これがルールです。

数ヶ月の場合、ISO 8601形式の「年 - 月 - 日」を使用できます。ここで、年は正数、月は 01 ~ 12 の数字、日は 01 ~ 31 の数字です。数字が10未満の場合は、前に0が必要です。年が68以下の場合は2000が追加され、年が100未満の場合は1900が追加されます。米国で広く使用されている「月/日/年」構造が許可されています。なお、「月/日」は年を省略します。

「January」、「February」、「March」、「April」、「May」、「June」、「July」、「August」、「September」、「October」、「November」または「November」でフルスペルを入力できます。 「12月」。文字通りの月は最初の3文字に短縮され、その後に短縮されます。 「9月」の代わりに「9月」を書くこともできます。

月を文字通り書くと、カレンダーの日付は、次のいずれかで指定できます。

 日月年 日月
 月 日年
 日月
 年

私は強調した

ここでは同様の形式がないことがわかります。年月日! (月は文字通り表記されます)

答え3

組み込み関数(passable)と(reverse)を使用zshできます。strftimezsh/datetime-r

strftime -r時間文字列の書式設定

それを使う滞在分析する時間文字列そして、epoch以降の秒数を出力します。

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

日付が無効な場合、エラーが表示されます。

strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5: 型の不一致

epoch 以降の秒を次のような他の標準/カスタム日付形式に変換することもできます。

strftime '%A, %B %d, %Y' 1447970400
2015年11月20日金曜日

関連情報