Как найти различие между двумя метками времени до миллисекунд?

Мне всегда нравилось это небольшое изображение о дистрибутивах Linux и их отношениях.:)

http://fr.wikipedia.org/wiki/Fichier:Gldt.svg

10
21.11.2012, 01:15
3 ответа

Никакая потребность сделать сложный парсинг, сделает все волшебство для Вас, с помощью его друга, :

#!/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 время эпохи (секунды с 01.01.1970)
  • %N наносекунды
  • $(( )) и (( )) для bash арифметика, см. http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) обозначает command substitution

Это пригодно Ваши потребности также?

13
27.01.2020, 20:02
  • 1
    Исправленный arithhmetic ошибка (связывающий секунды и наносекунды). Теперь я сначала вычисляю секунды (OP не делают спрошенный что, но для полноты и устойчивости в повторном использовании) –  Gilles Quenot 20.11.2012, 10:17

Язык сценариев, такой как Perl, Python или Ruby будет быстр и потребует небольшого усилия. Например, с Perl и Датой:: Синтаксический анализ:

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

(Для каждой строки, замены , ., разделите строку на слова $_[0] через $_[3], проанализируйте даты, сформированные первыми двумя и следующими двумя словами, и распечатайте различие.)

0
27.01.2020, 20:02
  • 1
    "Мало усилия" довольно относителен. Несомненно, если Вы - X программистов и знаете о библиотеке Y, это - подпруга. Это - то, как это всегда. На самом деле я удивлен, что Python программист еще не вскочил здесь. Я полагаю, что это - просто вопрос времени... :-\ –  Mike S 06.12.2015, 08:58

Я только что наткнулся на этот пост, есть -по крайней мере сегодня -более простоеdate-решение. Использование фреймворка в ответе @Gilles Quenot (написало бы комментарий к его ответчику, но недостаточно репутации):

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приведет к усечению вывода до миллисекунд.

1
27.01.2020, 20:02

Теги

Похожие вопросы