मिलीसेकंड तक दो टाइमस्टैम्प के बीच अंतर कैसे पता करें?


10

मैं शेल स्क्रिप्टिंग में नया हूं। मेरी स्क्रिप्ट का दिल दो टाइमस्टैम्प से मिलीसेकंड तक के अंतर को खोजना है। मेरे साथ मेरे पास टाइमस्टैम्प की सामग्री के साथ ही एक फ़ाइल है

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
क्या डीएसटी तस्वीर में आता है? सेकंड लीप? डीएसटी नियम क्या हैं? क्या वे आपके देश में समय के साथ बदल गए हैं? क्या आपको 1970 से पहले, या ग्रेगोरियन कैलेंडर पर स्विच करने से पहले तारीखों से निपटना होगा?
स्टीफन चेजलस

जवाबों:


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है युग समय (01-01-1970 के बाद से सेकंड)
  • %Nहै नैनोसेकंड
  • $(( ))और (( ))के लिए है bashगणित, देख http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) के लिए खड़ा है command substitution

क्या यह आपकी आवश्यकताओं के अनुरूप है?


1
एक अंकगणित त्रुटि ( कंक्रीटिंग सेकंड और नैनोसेकंड) को ठीक किया। अब मैं पहले सेकंड की गणना करता हूं (ओपी ने यह नहीं पूछा, लेकिन पुन: उपयोग में पूर्णता और मजबूती के लिए)
गिलेस क्वेनोट

0

एक स्क्रिप्टिंग भाषा जैसे पर्ल, पायथन या रूबी तेज होगी और इसके लिए बहुत कम प्रयास की आवश्यकता होती है। उदाहरण के लिए, पर्ल और दिनांक :: पार्स के साथ :

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

(प्रत्येक पंक्ति के लिए, ,द्वारा प्रतिस्थापित करें ., लाइन को शब्दों के $_[0]माध्यम से विभाजित करें $_[3], पहले दो और अगले दो शब्दों द्वारा बनाई गई तिथियों को पार्स करें और अंतर को प्रिंट करें।)


"थोड़ा प्रयास" काफी सापेक्ष है। यकीन है, अगर आप एक एक्स प्रोग्रामर हैं और वाई लाइब्रेरी के बारे में जानते हैं, तो यह एक चिंच है। हमेशा ऐसा ही होता है। वास्तव में, मुझे आश्चर्य है कि एक पायथन प्रोग्रामर ने अभी तक यहां नहीं छलांग लगाई है। मुझे लगता है कि यह समय की बात है ...: - \
माइक एस

इसलिए लोग यहां पूरा समाधान देते हैं। इस तरह से आपको X प्रोग्रामर बनने या Y लाइब्रेरी के बारे में जानने की आवश्यकता नहीं है। और आप अभी भी अपनी स्क्रिप्ट में एक पंक्ति होने के "छोटे प्रयास" से लाभान्वित होते हैं और 10. नहीं
चेरीडॉट

0

मैं अभी इस पोस्ट पर आया था, वहाँ है - कम से कम आज - एक सरल- dateआधारित समाधान। @ गिलेन्स कोटेनोट के उत्तर में फ्रेमवर्क का उपयोग करते हुए (उनकी टिप्पणी के लिए टिप्पणी लिखी होगी, लेकिन पर्याप्त प्रतिष्ठा नहीं):

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उत्पादन को मिलीसेकंड तक छोटा कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.