首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查两个“日期时间”时间戳之间的“日期时间”时间戳

如何检查两个“日期时间”时间戳之间的“日期时间”时间戳
EN

Unix & Linux用户
提问于 2019-12-20 09:04:47
回答 1查看 1.8K关注 0票数 1

我搜索并找到了几种方法来检查时间戳是否介于两个时间戳之间,但所有的方法假设 HH:MM:SS格式都不考虑日期

我的实际场景是从日志文件输入时间戳,格式包括日期和毫秒:2019-11-11 19:05:55,823

假设我有一个给定的时间戳2019-11-11 19:05:55,823,如何确定它是在范围内还是在范围之外:

代码语言:javascript
复制
2019-11-11 17:02:54,479
2019-11-12 05:13:55,998

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-12-20 09:10:39

具体来说,bash应该是一个问题:

代码语言:javascript
复制
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的S [[ < / > ]]操作符使用strcoll()来比较字符串,所以使用本地化排序算法。在C语言环境中,strcoll()的工作方式类似于strcmp()。在其他语言环境中,它按照区域设置的约定进行比较,因此对结果没有太多的保证。

POSIXly,您可以使用:

代码语言:javascript
复制
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进行比较。假设时间戳位于每行的开头:

代码语言:javascript
复制
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

将打印以该范围内的时间戳开头的行。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/558204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档