【发布时间】:2014-04-26 09:17:55
【问题描述】:
我有像[%Y-%m-%d %H:%M:%S] 这样的时间格式和像[2009/05/11 07:30:00] 这样的时间戳。我需要的是如何比较这两个值。可能是时间戳与时间格式不同,例如[%Y-%m%d %H:%M]。这是错误的。
有什么想法吗?
【问题讨论】:
标签: bash datetime comparison
我有像[%Y-%m-%d %H:%M:%S] 这样的时间格式和像[2009/05/11 07:30:00] 这样的时间戳。我需要的是如何比较这两个值。可能是时间戳与时间格式不同,例如[%Y-%m%d %H:%M]。这是错误的。
有什么想法吗?
【问题讨论】:
标签: bash datetime comparison
如果日期的格式不一定相同,一种简单的方法是将它们转换为 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 了解许多常见的日期格式,而无需先输入。
【讨论】:
date 8.22 退出代码在两种情况下都是 0,并且它们给出相同的结果。您是否使用其他 date?
要verify知道日期字符串采用特定格式,您可以将日期强制转换为您想要的格式并验证该字符串是否与您开始时的相同:
$ 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 中指定输入格式)。
【讨论】:
-,并且日期在年、月、日之间有/。修复后就ok了。谢谢@l0b0
如果日期格式相同,且该格式为 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
【讨论】: