4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

年月日時分(YYYYMMDDhhmm)の妥当性チェック

Last updated at Posted at 2015-11-24

シェルスクリプトで年月日時分(YYYYMMDDhhmm)までの日付を扱う時に、
入力された値が妥当な値(※)であるかをチェックする方法。


201504351020 = 2015年04月35日10時20分
201504012500 = 2015年04月01日25時00分
等の存在しない年月日時分をエラーとする。

入力が年月日(YYYYMMDD)であれば

date -d 20150401 >/dev/null 2>&1
echo $? # 0:OK 1:NG

のようにdateに食わせてチェック可能。

また、"201504011530"を"20150401 15:30"のように形式を変えて

date +'%Y%m%d %H:%M' -d "20150401 15:30"
echo $? # 0:OK 1:NG

のように12桁をバラせばdateに食わせて同じように判定に使えるようだが、
作成の都合上バラしたくない。(というかめんどくさかった。)

結局、12桁の値を"touch -t"に渡して適当なファイル(/tmp/_datetimecheck)の
タイムスタンプに設定して、設定が成功するかどうかで判定させることに。

# SetDate (YYYYMMDDhhmm)
echo -n -e " \"Set DateTime (YYYYMMDDhhmm)\" > "
read DATETIME

datetime_check $DATETIME

if [ $? -gt 0 ]; then
    echo -e " \"$DATETIME is NG. Set Correct DateTime (YYYYMMDDhhmm)\""
    exit 1
    fi

# datetime_check() - 年月日時分チェック
# $1 : $DATETIME
# $? : 0:OK 1:NG(日付時刻異常)
function datetime_check() {
    touch -t $1 /tmp/_datetimecheck >/dev/null 2>&1
    return $?   #"0"ならOK。"1"ならNG。
}

#その他のチェック(桁数チェック、数字以外の文字などが入力されてないか)については割愛

もっとスマートな方法があればどなたか教えてください。
というか、当初使うつもりだったdateコマンドでの方法が、

date +'%Y%m%d%H%M' -d 201504011530
date: invalid date `201504011530'

と言う風に"invalid date"と言われてしまうのか未だに分からずモヤモヤしています。

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?