シェルでの日付検証


14

シェルスクリプトで以下の日付形式を検証したい

2015-Jul-13

私は使用date -d "2015-Jul-13" +"%Y-%b-%d"していますが、そのエラーを与える

date: invalid date '2015-Jul-13'

@Pandya:OPは彼/彼女の質問について明確です。OPは、言及された日付形式を検証(入力された日付が有効かどうかを確認)したいが、入力された日付が無効であると言っています。
ゆえに

GNU dateは認識しませんYYYY-MMM-DDYYYY-MM-DDまたはDD MMM YYYY代わりに使用できますか?
ロアイマ

確かにatそうだし、そうだと思うtouch。私はtouch一度に基づいて日付検証シェル関数を書きました... いや、そうではありませんtouch-それは数字を処理するだけですが、atかなり深い解析を行います
...-mikeserv

当社による@Thushiみましょう明確な冗長コメント
Pandya

6
タイトルを読み違え:日付の検証は地獄です
アダムデイビス

回答:


12

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 以降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

@mikeserv:かっこいい!連携して: コマンドのymd=$(IFS=-;set $ymd; echo "$3-$2-$1") 背後にある魔法を明らかにできますsetか?
joepd

11

マンページから:-

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形式の 'year-month-day'が許可されます。ここで、年は任意の正数、月は01〜12の数、日は01〜31の数です。先行ゼロが存在する必要があります数値が10未満の場合。年が68以下の場合、2000が追加されます。それ以外の場合、年が100未満の場合、1900が追加されます。米国で人気のある「月/日/年」という構文が受け入れられます。また、年を省略した「月/日」。

リテラル月は、「1月」、「2月」、「3月」、「4月」、「5月」、「6月」、「7月」、「8月」、「9月」、「10月」、「 11月」または「12月」。リテラル月は最初の3文字に省略され、場合によっては省略ドットが続くことがあります。「9月」ではなく「9月」と書くことも許可されています。

月が文字通り書かれている場合、カレンダーの日付は次のいずれかで指定できます。

 日月年
 日月
 月日年年
 日月年

私が強調した

ここでは、year-month-dayのような形式がないことがわかります。(月は文字通りに書かれています)


7

zsh使用すると、strftime組み込みの(を介して使用可能zsh/datetime)を-r(リバース)で使用できます。

strftime -r 形式のタイムストリング

formatを使用して時間文字列を解析し、エポックからの秒数を出力します。

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

日付が無効な場合、これはエラーになります。

strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5:形式が一致しません

また、エポックからの秒数を他の標準/カスタム日付形式に変換できます。

strftime '%A, %B %d, %Y' 1447970400
2015年11月20日金曜日
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.