我有类似[%Y-%m-%d %H:%M:%S]
的时间格式和类似[2009/05/11 07:30:00]
的时间戳。我需要的是如何比较这两个值。时间戳可能与时间格式不同,例如[%Y-%m%d %H:%M]
。这是错误的。一些想法?
如果日期不一定是相同的格式,一种简单的方法是将它们转换为Unix时间戳:
$ date --date="2009/05/11 07:30:00" +%s
1242023400
$ date --date="2009/05/11 07:30" +%s
1242023400
这将给你一个整数值,你可以很容易地使用进行比较
if [ "$(date --date="$my_date" +%s)" -gt "$(date --date="$my_other_date" +%s)" ]
date
可以理解许多常见的日期格式,而无需首先输入。
要验证日期字符串是否为特定格式,您可以将日期强制转换为所需格式,并验证该字符串是否与您开始时使用的相同:
$ format='%Y/%m/%d %H:%M:%S'
$ invalid_date='2009/05/11 07:30'
$ [ "$(date --date="$invalid_date" +"$format")" = "$invalid_date" ]
$ echo "$?"
1
$ valid_date='2009/05/11 07:30:00'
$ [ "$(date --date="$valid_date" +"$format")" = "$valid_date" ]
$ echo "$?"
0
这只适用于与date
兼容的日期字符串(不能直接在date
中指定输入格式)。
如果日期的格式相同,并且格式是4位数的年,后跟月、日期、小时、分钟和秒,但有些日期在末尾被截断,则可以填写后缀并将这些日期作为字符串进行比较:
$ rpad_date() {
case ${#1} in
4)
format='%s/01/01 00:00:00'
;;
7)
format='%s/01 00:00:00'
;;
10)
format='%s 00:00:00'
;;
13)
format='%s:00:00'
;;
16)
format='%s:00'
;;
19)
format='%s'
;;
*)
echo "Unknown format: $1" >&2
return 1
esac
printf "$format" "$1"
}
$ rpad_date "2004"
2004/01/01 00:00:00