如何在shell脚本中将日期变量“d/mm/yy”存储为变量“dd/mm/yy”
问题描述:
我有一个日期存储在d/mm/yy
格式中的一个变量中,表示为6/09/17
。我想将它与dd/mm/yy
格式的日期进行比较,例如,06/09/17
存储在另一个变量中。如何在shell脚本中将日期变量“d/mm/yy”存储为变量“dd/mm/yy”
如果我直接比较这两个变量,它们并不相等,但它们应该是相等的。
有人可以建议如何将第一个变量中的日期转换为另一个变量中存储的日期格式,即从d/mm/yy
到dd/mm/yy
?
答
您可以使用日期转换为格式你喜欢:
date --date="6/09/17" +"%d/%m/%Y"
输出:
09/06/2017
答
比较日期应该在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"
答
那么对于这个特定的情况下仅领先的零丢失和你正在使用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
答
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添加到日期变量中。检查日期是否匹配并相应地退出。检查退出状态以判断是否匹配。
此解决方案也可以修改以考虑一位数的月份。
日期:非法选项 - 日期= 6/9月17日 用法:日期[-u] MMDDHHMM [[CC] YY] [SS] 日期[-u] [+格式] 日期-a [ - ] sss [.fff] – prince623
我试过这个方法,但得到错误以上错误 – prince623
错误的复制和粘贴,或古代日期命令 – m47730