यूनिक्स युग के बाद से मिलीसेकंड कैसे प्राप्त करें?


30

मैं एक bash स्क्रिप्ट करना चाहता हूं जो एक ब्राउज़र के लॉन्च समय को मापता है कि मैं एक HTML का उपयोग कर रहा हूं जो जावास्क्रिप्ट का उपयोग करके मिलीसेकंड में समय-स्टैंप को लोड करता है।

ब्राउज़र कॉल करने से ठीक पहले शेल स्क्रिप्ट में मुझे टाइम-स्टैंप मिल जाता है:

date +%s

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

मैं बैश स्क्रिप्ट से मिलीसेकंड में टाइम-स्टैंप कैसे प्राप्त कर सकता हूं?

जवाबों:


28

date +%s.%Nआप जैसे दे देंगे,।, 1364391019.877418748। % N वर्तमान सेकंड में समाप्त हुए नैनोसेकंड की संख्या है। ध्यान दें कि यह 9 अंक का है, और डिफ़ॉल्ट तिथि से यह शून्य के साथ पैड होगा यदि यह 100000000 से कम है। यह वास्तव में एक समस्या है अगर हम संख्या के साथ गणित करना चाहते हैं, क्योंकि बैश एक प्रमुख शून्य के साथ संख्याओं को अष्टक मानते हैं । क्षेत्र की कल्पना में एक हाइफ़न का उपयोग करके इस पैडिंग को निष्क्रिय किया जा सकता है, इसलिए:

echo $((`date +%s`*1000+`date +%-N`/1000000))

भोलेपन से आपको मिलिसेकंड देगा।

हालाँकि , जैसा कि स्टीफन चेज़ेलस नीचे टिप्पणी में बताते हैं, यह दो अलग-अलग dateकॉल हैं जो दो अलग- अलग समयों का उत्पादन करेंगे। यदि दूसरा उनके बीच में लुढ़का हुआ है, तो गणना पूरी दूसरी बंद हो जाएगी। इसलिए:

echo $(($(date +'%s * 1000 + %-N / 1000000')))

या अनुकूलित (नीचे टिप्पणियों के लिए धन्यवाद, हालांकि यह स्पष्ट होना चाहिए था):

echo $(( $(date '+%s%N') / 1000000));

मैंने इसे आज़माया और यह काम करता है, धन्यवाद + 1 / स्वीकार करें!
एडुआर्ड फ्लोरिनेस्कु

7
ध्यान दें कि जब आप पहली तारीख और दूसरी तारीख को चलाते हैं, उस समय के दौरान, कई मिलियन नैनोसेकंड पास हो गए होंगे और यह दूसरा भी नहीं हो सकता है। सर्वश्रेष्ठ करने के लिए $(($(date +'%s * 1000 + %N / 1000000')))। यह अभी भी बहुत मतलब नहीं है, लेकिन अधिक विश्वसनीय होगा।
स्टीफन चेज़लस

1
तारीख (1)
एलो महाल्ड

3
%NBSD और OS X में उपलब्ध नहीं है
orkoden

1
सिर्फ क्यों नहीं echo $(( $(date '+%s%N') / 1000000))?
हाईटेककंप्यूटरजेक

47

जीएनयू या date(या FEATURE_DATE_NANOसक्षम विकल्प के साथ निर्मित होने पर ), या व्यस्त बॉक्स के खुले-खुले कार्यान्वयन के साथ , मैं उपयोग करूंगा:

$ date +%s%3N

जो यूनिक्स युग के बाद से मिलीसेकंड देता है।


5
सुरुचिपूर्ण, अच्छा, +1
एडुआर्ड फ्लोरिनेसस्कु

1
भव्यता के लिए Upvoting
sleepycal

वास्तव में सुंदर, +1। अगर मेरी तरह आप यह सुनिश्चित करना चाहते हैं कि %3Nआवश्यक बाईं शून्य गद्दी (डॉक्स पढ़ने के बिना; ;-), आप कर सकते हैं while sleep 0.05; do date +%s%3N; done, और हाँ, आवश्यक शून्य वहाँ हैं।
टेरी ब्राउन

धन्यवाद टेरी! हालांकि %3Nवास्तव में शून्य गद्देदार है। इसके अलावा मुझे नहीं लगता कि आपका समाधान शून्य जोड़ देगा, बस प्रतिक्रिया को इतना कम करने में देरी होगी।
javabeangrinder

javabeangrinder, @ TerryBrown का कोड एक समाधान नहीं था , बस यह सत्यापित करने के लिए कि %3Nवास्तव में 0-गद्देदार है कोड का परीक्षण करें ।
स्टीफन चेज़लस

10

यदि कोई अन्य गोले का उपयोग कर रहा है bash, ksh93और यदि आपके zshपास एक अस्थायी बिंदु $SECONDSचर है, तो typeset -F SECONDSसटीकता के साथ समय को मापना आसान हो सकता है:

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

चूंकि संस्करण 4.3.13 (2011) zshमें मॉड्यूल $EPOCHREALTIMEमें एक विशेष फ्लोटिंग पॉइंट वैरिएबल है zsh/datetime:

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993

ध्यान दें कि यह दो पूर्णांकों (सेकंड और नैनोसेकंड के लिए) से लिया गया है clock_gettime()। अधिकांश प्रणालियों पर, यह एकल सी doubleफ्लोटिंग पॉइंट संख्या की तुलना में अधिक सटीक है , इसलिए जब आप इसे अंकगणितीय अभिव्यक्तियों (1970 के पहले कुछ महीनों में तारीखों को छोड़कर) में उपयोग करते हैं, तो आप सटीक खो देंगे।

$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064

उच्च परिशुद्धता समय के अंतर की गणना करने के लिए (हालांकि मुझे संदेह है कि आपको मिलीसेकंड परिशुद्धता से अधिक की आवश्यकता होगी), आप $epochtimeइसके बजाय विशेष सरणी का उपयोग करना चाह सकते हैं (जिसमें दो अलग-अलग तत्वों के रूप में सेकंड और नैनोसेकंड शामिल हैं)।

संस्करण 5.7 (2018) के बाद से strftimeशेल बिल्ट का भी समर्थन करता है%N नैनोसेकंड प्रारूप आ ला जीएनयू dateऔर एक %.सटीक निर्दिष्ट करने के लिए , इसलिए युग के बाद से मिलीसेकंड की संख्या को भी पुनः प्राप्त किया जा सकता है:

zmodload zsh/datetime
strftime %s%3. $epochtime

(या के साथ एक चर में संग्रहीत -s var)


ध्यान दें कि चर "$ SECONDS" जुड़ा नहीं है / © समय से संबंधित है। आंशिक भाग (मिलीसेकंड, माइक्रोसेकंड और नैनोसेकंड) प्रत्येक में काफी भिन्न हो सकते हैं।
इसहाक

8

मिलीसेकंड प्राप्त करने के लिए गणना से बचने के लिए, कमांड लाइन जावास्क्रिप्ट दुभाषिए मदद कर सकते हैं:

bash-4.2$ node -e 'console.log(new Date().getTime())' # node.js
1364391220596

bash-4.2$ js60 -e 'print(new Date().getTime())'       # SpiderMonkey
1364391220610

bash-4.2$ jsc -e 'print(new Date().getTime())'        # WebKit 
1364391220622

bash-4.2$ seed -e 'new Date().getTime()'              # GNOME object bridge
1364391220669

उबंटू ईओएन पर उन दुभाषियों वाले पैकेज:


2

बैश 5+ में माइक्रो-सेकंड ग्रैन्युलैरिटी के साथ एक चर है $EPOCHREALTIME:।

इसलिए:

$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635

मील के पत्थर में युग (1/1/70) के बाद से प्रिंट समय।

ऐसा करने में, आपको दिनांक का उपयोग करना होगा। या तो GNU दिनांक:

echo "$(date +'%s%3N')"

Https://serverfault.com/a/423642/465827 में सूचीबद्ध विकल्पों में से एक

या brew install coreutilsओएस एक्स के लिए

या, यदि सब कुछ विफल रहता है, तो संकलन करें (gcc epochInecsec.c) इस सी प्रोग्राम (आवश्यकतानुसार समायोजित करें):

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
  struct timeval time_now;
    gettimeofday(&time_now,NULL);
    printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);

    return 0;
}

ध्यान दें कि किसी भी बाहरी प्रोग्राम को कॉल करने के लिए डिस्क को पढ़ने, लोड करने, चलाने और अंत में आउटपुट प्रिंट करने के लिए समय की आवश्यकता होती है। इसमें कई मिली सेकेंड लगेंगे। यह न्यूनतम सटीकता है जिसे किसी भी बाहरी उपकरण (दिनांक सहित) के साथ प्राप्त किया जा सकता है।

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