将 GNU awk 用于时间函数:
$ cat tst.awk
BEGIN {
tgtDays = 10
tgtSecs = tgtDays * 24 * 60 * 60
endTime = strftime("%Y %m %d 12 00 00")
endSecs = mktime(endTime,1)
}
{
mthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",$4)+2)/3
begTime = sprintf("%04d %02d %02d 12 00 00", $7, mthNr, $5)
begSecs = mktime(begTime,1)
}
(endSecs - begSecs) < tgtSecs
$ awk -f tst.awk sample.txt
system system_data8 Thu Jul 29 22:36:38 2021
请注意,在上面我们将输入数据和当前时间中的时间替换为中午,因为在确定两个日期之间的天数时,首先将时间戳转换为自纪元以来的秒数,然后除以一天中的秒数,您必须每天使用相同的时间,否则您的“天数”计算可能/将被每天的时间抛出。
例如,查看以下尝试确定相隔 10 天的 2 个日期是否相隔不到 10 天:
$ cat diffDatesDemo.awk
BEGIN {
tgtDays = 10
tgtSecs = tgtDays * 24 * 60 * 60
begTime = "2021/08/01 09:00:00"
endTime = "2021/08/11 08:00:00"
begDate = gensub(/([ :][0-9]{2}){3}$/,"",1,begTime)
endDate = gensub(/([ :][0-9]{2}){3}$/,"",1,endTime)
print "Is", begTime, "less than", tgtDays, "days before", endTime "?"
####
print "\nWrong: Compare 2 timestamps including date plus time of day:"
begSecs = mktime(gensub("[/:]"," ","g",begTime),1)
endSecs = mktime(gensub("[/:]"," ","g",endTime),1)
print begDate, "->", endDate, "is", ((endSecs - begSecs) < tgtSecs ? "<" : ">="), tgtDays, "days"
####
####
print "\nRight: Compare 2 dates at the same time each day:"
begSecs = mktime(gensub("[/:]"," ","g",begDate)" 12 00 00",1)
endSecs = mktime(gensub("[/:]"," ","g",endDate)" 12 00 00",1)
print begDate, "->", endDate, "is", ((endSecs - begSecs) < tgtSecs ? "<" : ">="), tgtDays, "days"
####
}
$ awk -f diffDatesDemo.awk
Is 2021/08/01 09:00:00 less than 10 days before 2021/08/11 08:00:00?
Wrong: Compare 2 timestamps including date plus time of day:
2021/08/01 -> 2021/08/11 is < 10 days
Right: Compare 2 dates at the same time each day:
2021/08/01 -> 2021/08/11 is >= 10 days
我还为上面的 mktime() 使用了 UTC 标志,以确保任何本地 DST 更改不会影响天数计算。