我搜索并找到了几种方法来检查时间戳是否在两个时间戳之间,但所有方法方法假设 HH:MM:SS
只考虑格式,不考虑日期。
我的现实生活场景是从日志文件输入的时间戳,采用常见格式,包括日期和毫秒:2019-11-11 19:05:55,823
.
假设我有一个给定的时间戳2019-11-11 19:05:55,823
,我如何确定它是在范围内还是之外:
2019-11-11 17:02:54,479
2019-11-12 05:13:55,998
?
答案1
特别是对于 bash,它应该只是一个问题:
start='2019-11-11 17:02:54,479'
end='2019-11-12 05:13:55,998'
date='2019-11-11 19:05:55,823'
if LC_ALL=C command eval '[[ ! $date < $start && ! $date > $end ]]'; then
echo the date is in the range
fi
这会进行词汇比较。这是可行的,因为在 C 语言环境中,这些日期表示形式按词汇和时间顺序排序是相同的。
bash
的[[ < / > ]]
运算符用于strcoll()
比较字符串,因此使用本地化排序算法。在 C 语言环境中strcoll()
意味着像strcmp()
.在其他语言环境中,它会根据语言环境的约定进行比较,因此您无法对结果得到太多保证。
POSIXly,你可以使用:
if LC_ALL=C expr "x $date" '>=' "x $start" '&' "x $date" '<=' "x $end" > /dev/null; then
echo the date is in the range
fi
现在,如果您正在处理日志文件,您可能希望与awk
.假设时间戳位于每行的开头:
LC_ALL=C awk -v start='2019-11-11 17:02:54,479' \
-v end='2019-11-12 05:13:55,998' '
$0 >= start && $0 <= end' < file.log
将打印以该范围内的时间戳开头的行。