Milisaniyeye kadar iki zaman damgası arasındaki fark nasıl bulunur?


10

Komut dosyası oluşturmada yeniyim. Senaryomun kalbi, iki zaman damgası ile milisaniye arasındaki farkı bulmaktır. Benimle sadece zaman damgası içeriği olan bir dosya var

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

Bunun gibi ben yaklaşık 30k kayıtları var, burada komut dosyası yürütürken herhangi bir performans sorunu ile karşı karşıya olmam gerekir. Bunun için senaryo yazmaya çalıştığımda artık yıl, 31 gün vb. Aylar gibi birçok faktör resme giriyor.

Birisi bana bu konuda yardımcı olabilir mi lütfen?


1
DST resme giriyor mu? Artık saniye mi? DST kuralları nelerdir? Ülkenizde zaman içinde değiştiler mi? 1970'den önce veya gregorik takvime geçmeden önce tarihlerle uğraşmak zorunda mısınız?
Stéphane Chazelas

Yanıtlar:


13

Karmaşık ayrıştırma yapmaya gerek yok, arkadaşının yardımıyla senin için tüm sihri yapacak :

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

ÇIKTI

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

Görmek man date

NOT

  • date -d çok faydalı, zaman damgalarını dönüştürüyor
  • %sbir dönem süresi (01-01-1970 yana saniye)
  • %Nolduğu nanosaniye
  • $(( ))ve (( ))içindir basharitmetik, bkz http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) anlamına gelir command substitution

Bu da sizin ihtiyaçlarınıza uygun mu?


1
Aritmetik bir hata düzeltildi (saniye ve nanosaniyeyi birleştiriyor). Şimdi ilk önce saniyeleri hesaplıyorum (OP bunu sormadı, ancak yeniden kullanımda eksiksizlik ve sağlamlık için)
Gilles Quenot 20:12

0

Perl, Python veya Ruby gibi bir betik dili hızlı olacak ve çok az çaba gerektirecektir. Örneğin, Perl ve Tarih :: Ayrıştırma ile :

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

(Her hat için, yerine ,göre .kelimelere çizgiyi bölmek, $_[0]içinden $_[3]ilk iki ve sonraki iki kelime ile oluşturulan tarihleri ayrıştırmak, ve farkı yazdırın.)


"Az çaba" oldukça göreceli. Elbette, bir X programcısıysanız ve Y kütüphanesini biliyorsanız, bu bir cinch. Her zaman böyle. Aslında, bir Python programcısının henüz buraya atlamamasına şaşırdım. Ben sadece bir zaman meselesi ...: - \
Mike S

Bu yüzden insanlar burada tam bir çözüm sunuyor. Bu şekilde bir X programcısı olmanız veya Y kütüphanesini bilmeniz gerekmez. Ve hala senaryonuzda bir satır olması ve "az çaba" dan faydalanabilirsiniz.
CherryDT

0

Bu yazıyla daha yeni karşılaştım, en azından bugün - daha basit datetabanlı bir çözüm var. @Gilles Quenot'un cevabındaki çerçeveyi kullanarak (anwser'a bir yorum yazardı, ancak yeterli itibarı yoktu):

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

Sonuç:

$ ./time_elapsed.sh 
0.007000000

%3NBunun yerine kullanıldığında %Nçıktı milisaniye kesilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.