ISO 格式 YYYYMMDD Alias/Script Linux

ISO-Format JJJJMMTT Alias/Script Linux

大家好,

我想将 dat2iso 命令作为脚本或别名实现,它接受德语格式 DD.MM.YYYY 的日期作为参数,并输出 ISO 格式 YYYYMMDD 的日期作为输出(在标准输出上)。 示例(作为别名或作为系统路径中的脚本;

outputs: 
$ dat2iso 30.09.2021
20210930
$ dat2iso 01.01.2022
20220101
$ dat2iso 03/10/2021
Error!   <-- Because the separator was. required.
$ dat2iso 03.10.21
Error!   <-- Because the year YYYY was prescribed with four digits.
$ dat2iso 32.09.2021
Error!   <-- Denn einen 32. gibt es nicht.
$ dat2iso 30.13.2021
Error!   <-- Because there is no 13th month.

到目前为止,我已经改变了甲酸盐,但我想不出其余的,但我仍在努力:

echo 30.09.2021 | awk -F '.' {'printf "%s%s%s\n",,,'}

这应该达到您的预期:

#!/bin/bash

dat2iso(){
    if  [[  =~ ^([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{4})$ ]]; then
        local date="${BASH_REMATCH[3]}${BASH_REMATCH[2]}${BASH_REMATCH[1]}"
        if  date -d "$date" >& /dev/null; then
            echo "$date"
        else
            echo "Invalid date value [$date]" >&2
        fi
    else
        echo "Invalid format of input []. Correct format [DD.MM.YYYY]" >&2
    fi
}

dat2iso 30.09.2021

一个非常冗长的解决方案,但它会检查您给定的豁免:

cat << EOF > dat2iso
#!/bin/bash

if [[ "$1" == "" ]];then echo -e "NO INPUT. Exiting."; exit 1 ;fi

echo $1 | awk -F '.' '/\//{ print "Input Error."; exit(1) }
   $1>31{ print "Too many days."; exit(1) }
   $2>12{ print "Too many months."; exit(1) }
   $3!~/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]/{ print "Not enough year digits."; exit(1) }
   { print $3$2$1 }'
EOF

chmod +x dat2iso

$ ./dat2iso 09.12.2021
20211209