如何找到两个时间戳之间最多毫秒的差异?

如何找到两个时间戳之间最多毫秒的差异?

我是 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

像这样,我有大约 30k 记录,当我执行脚本时,我不应该遇到任何性能问题。当我尝试为此编写脚本时,会考虑到许多因素,例如闰年、有 31 天的月份等。

有人可以帮我解决这个问题吗?

答案1

不需要做复杂的解析,会在他朋友的帮助下为你施展所有魔法,:

#!/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

这也符合您的需求吗?

答案2

我刚刚看到这篇文章,至少在今天有一个更简单的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会将输出截断为毫秒。

答案3

Perl、Python 或 Ruby 等脚本语言速度很快,而且不需要太多努力。例如,使用 Perl 和日期::解析:

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

(对于每一行,替换,为,通过.将该行拆分为单词,解析前两个单词和后两个单词形成的日期,并打印差异。)$_[0]$_[3]

相关内容