如何在shell脚本中将变量中的“d / mm / yy”存储转换为“dd / mm / yy”

时间:2017-09-08 08:12:56

标签: bash shell date scripting

我有一个日期存储在d/mm/yy格式的6/09/17格式的一个变量中。我想将其与dd/mm/yy格式的日期进行比较,例如,06/09/17存储在另一个变量中。

如果我直接比较这两个变量它们并不相同,但它们应该相等。

有人可以建议如何将第一个变量中的日期转换为另一个变量中存储的日期格式,即从d/mm/yy转换为dd/mm/yy吗?

4 个答案:

答案 0 :(得分:0)

您可以使用日期转换为您喜欢的格式:

date --date="6/09/17" +"%d/%m/%Y"

输出:

09/06/2017

答案 1 :(得分:0)

比较日期应以iso格式转换yyyy-mm-dd

date0=6/09/17
year0=${date0##*/}     # remove longest prefix "*/" = "6/09/" -> "17"
tmp=${date0%/*}        # remove shortest suffix "/*" = "/17"  -> "6/09"
month0=${tmp##*/}      # remove longest prefix "*/" = "6/" -> "09"
day0=${tmp%/*}         # remove shortest suffix "/*" = "/09"  -> "6"

printf -v date1 "%4d-%02d-%02d" "20${year0#0}" "${month0#0}" "${day0#0}"

echo "$date1"

或更清晰,但效率可能更低

IFS=/ read dd mm yy <<< 6/09/17
printf -v date1 "%4d-%02d-%02d" "20${yy#0}" "${mm#0}" "${dd#0}"
echo "$date1"

答案 2 :(得分:0)

对于这种特殊情况,只有前导零缺失并且您正在使用Bash,您可以使用=~运算符:

$ query=6/09/17
$ match=06/09/17
$ [[ $match =~ ^0?$query ]] && echo yes
yes
$ [[ $query =~ ^0?$query ]] && echo yes
yes

非匹配:

$ fail=16/09/17
$ [[ $fail =~ ^0?$query ]] && echo yes

答案 3 :(得分:0)

dat="6/09/2017
dat1="06/09/2017"
awk -v dat1=$dat -v dat=$dat '{ split(dat,datarr,"/");split(dat1,datarr1,"/");if (length(datarr1[1])==1) { dat1="0"dat1 } if (length(datarr1[1])==1) { dat="0"dat } if (dat1==dat) { exit 0 } else { exit 1 } }' <<< ""
if [ "$?" == "0" ]
then
     echo "match"
else
     echo "No match"
fi

使用awk传递两个日期,然后将日期拆分为数组。使用它来检查一天的长度,然后在必要时将0添加到日期变量。检查日期是否匹配并相应地退出给定状态。检查退出状态以判断是否匹配。

此解决方案也可以修改为考虑一个数字的月份。