如何找到两个时间戳之间的差异(以毫秒为单位)?


10

我是Shell脚本的新手。我的脚本的核心是找出两个时间戳之间的差值,最高可达毫秒。和我一起,我有一个只包含时间戳内容的文件

2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447

像这样,我大约有3万条记录,执行脚本时应该不会遇到任何性能问题。当我尝试为此编写脚本时,许多因素都会出现,例如leap年,31天的月份等。

有人可以帮我吗?


1
DST是否出现在图片中?seconds秒?DST规则是什么?他们在您的国家/地区随时间变化了吗?您是否需要处理1970年之前的日期,或切换到公历之前的日期?
斯特凡Chazelas

Answers:


13

无需复杂的解析,在他的朋友的帮助下,将为您解决所有

#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
  secdiff=$((
    $(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
  ))
  nanosecdiff=$((
    $(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
  ))
  printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
    (secdiff * 1000) + (nanosecdiff / 1000000)
  ))
done < YOUR_FILE.txt

输出值

2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds

看到 man date

注意

  • date -d 非常有用,它可以转换时间戳
  • %s纪元时间(1970年1月1日以来的秒数)
  • %N纳秒
  • $(( ))并且(( ))用于bash算术,请参阅http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) 代表 command substitution

这也符合您的需求吗?


1
纠正了算术错误(连接秒和纳秒)。现在,我首先计算秒数(OP并没有要求,但要确保重复使用的完整性和鲁棒性)
Gilles Quenot 2012年

0

诸如Perl,Python或Ruby之类的脚本语言将很快并且几乎不需要任何努力。例如,使用Perl和Date :: Parse

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(对于每行,用替换,.,将行$_[0]通过分割成多个单词$_[3],解析前两个单词和后两个单词形成的日期,然后打印出差异。)


“小努力”是相对的。当然,如果您是X程序员并且了解Y库,那将是一件容易的事。总是这样。实际上,我很惊讶Python程序员还没有加入。我认为这只是时间问题...:-\
Mike S

这就是人们在这里提供完整解决方案的原因。这样,您不必成为X程序员或知道Y库。而你仍然在你的脚本一行的“举手之劳”中获益,而不是10
CherryDT

0

我刚刚看到这篇文章,至少在今天,有一个date基于简单的解决方案。在@Gilles Quenot的答案中使用该框架(本该对他的anwser进行评论,但声望不足):

while read d1_1 d1_2 d2_1 d2_2
do
    date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END

结果:

$ ./time_elapsed.sh 
0.007000000

使用%3N代替%N将截断输出到毫秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.