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


232

मुझे मिलीसेकंड में वर्तमान यूनिक्स समय कैसे मिल सकता है (1 जनवरी 1970 से यूनिक्स युग के बाद से मिलीसेकंड की संख्या)?

जवाबों:


264

इस:

date +%s 

युग के बाद से सेकंड की संख्या वापस आ जाएगी ।

इस:

date +%s%N

सेकंड और वर्तमान नैनोसेकेंड देता है।

इसलिए:

date +%s%N | cut -b1-13

युग के बाद से आपको मिलीसेकंड की संख्या देगा - वर्तमान सेकंड और नैनोसेकेंड के बाएं तीन।


और मिकीबी से - echo $(($(date +%s%N)/1000000))(1000 से विभाजित करके केवल माइक्रोसेकंड में लाया जाता है)


39
मुझे आश्चर्य है कि कितने एमएस कट में जोड़ता है :-)
काइल ब्रांड

13
या यदि आप शेल में यह सब करना चाहते हैं, तो एक अतिरिक्त प्रक्रिया के महंगे ओवरहेड से बचें (वास्तव में, हम उस समस्या से बच रहे हैं जब% + s + N परिवर्तनों में अंकों की संख्या):echo $(($(date +%s%N)/1000))
मिकीबी

5
यह मामले का सिद्धांत है ... जादू की संख्या और कोड से बचें जो आप वास्तव में मतलब रखते हैं
मिकीबी

25
मुझे लगता है कि यह ध्यान देने योग्य है कि आदमी ने यूनिक्स के लिए कहा, लिनक्स नहीं, और वर्तमान शीर्ष उत्तर (दिनांक +% s% N) मेरे AIX सिस्टम पर काम नहीं करता है।
पीट

12
@Pete +1 OS X के लिए समान है, और FreeBSD
ocodo

99

आप बस %3N3 सबसे महत्वपूर्ण अंकों (जो तब मिलीसेकंड हैं) के लिए नैनोसेकंड को छोटा करने के लिए उपयोग कर सकते हैं:

$ date +%s%3N
1397392146866

यह मेरे kubuntu 12.04 पर उदा काम करता है।

लेकिन ध्यान रखें, यह %Nआपके लक्ष्य प्रणाली के आधार पर लागू नहीं किया जा सकता है। उदाहरण के लिए एक एम्बेडेड सिस्टम (बिल्ड रूटोट, एक गैर-एचएफ आर्म क्रॉस टूलकिन का उपयोग करके) का परीक्षण किया गया था, वहां कोई नहीं था %N:

$ date +%s%3N
1397392146%3N

(और भी मेरे (गैर निहित) एंड्रॉयड टैबलेट के पास नहीं है %N)।


1
@warren: मैंने देखा है कि आप संपादित और बदल 1397392146%3Nकरने के लिए 1397392146%N, लेकिन के उत्पादन में 1397392146%3Nक्या मैं वास्तव में मेरे एंड्रॉयड टैबलेट की बिजीबॉक्स कंसोल पर देखा था कि है। क्या आप अपना संपादन समझा सकते हैं?
जो

इतिहास से वॉरेन की टिप्पणी "3 से 6 में बदल जाती है, क्योंकि 3 केवल आपको माइक्रोसेकंड में ले जाती है"। उनका संपादन पूरी तरह से सहज लगता है; आपको इसे वापस रोल करना चाहिए।
bukzor

1
यह विशेष रूप से जीएनयू कोरयूटिल्स की एक विशेषता है। अंततः, इसे यहाँ gnulib में लागू किया गया है: github.com/gagern/gnulib/blob/…
टेलोटोर्टियम

शायद वहाँ एक डॉट समझ में आता है। date +%s.%3Nप्रिंट करता है 1510718281.134
डार्कस्की

यह स्वीकृत उत्तर होना चाहिए।
नूह सुषमन

61

date +%N OS X पर काम नहीं करता है, लेकिन आप इनमें से किसी एक का उपयोग कर सकते हैं

  • माणिक: ruby -e 'puts Time.now.to_f'
  • अजगर: python -c 'import time; print time.time()'
  • Node.js: node -e 'console.log(Date.now())'
  • पीएचपी: php -r 'echo microtime(TRUE);'
  • अमृत: DateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • नजरबंद: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • या मिलीसेकंड के लिए निकटतम दूसरे दौर में date +%s000

1
पूर्णता के लिए ...node -e 'console.log(Date.now())'
18

1
PHP का उपयोग करना:php -r 'echo microtime(TRUE);'
TachyonVortex

8
ज़रूर, आपको बस उन दुभाषियों के गर्म होने की प्रतीक्षा करनी होगी। यह भी काम करता है:wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
कैमिलो मार्टिन

8
या, अगर आपको वास्तव में मिलीसेकंड की जरूरत नहीं है, लेकिन सिर्फ सही प्रारूप:date +%s000
लेनर होयट

1
Apple.stackexchange.com/questions/135742/… को OSX में Brew'scoreutils
sameers

9

बस इसे वहाँ से बाहर फेंक देना, लेकिन मुझे लगता है कि विभाजन के साथ सही सूत्र होगा:

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

9

मेरा समाधान सबसे अच्छा नहीं है लेकिन मेरे लिए काम किया है।

date +%s000

मुझे बस 2012-05-05 की तरह एक तिथि को मिलीसेकंड में बदलने की आवश्यकता थी।


1
अद्भुत हैक, योग्य :)
k06a

7
तुम मेरे सहकर्मियों में से कोई हो।
Nakilon

7

मिलि सेकंड पाने के लिए बाहरी प्रोग्राम चलाने का सुझाव देने वाले लोगों के लिए ... उस दर पर, आप ऐसा कर सकते हैं:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

बिंदु जा रहा है: यहाँ से किसी भी उत्तर को चुनने से पहले, कृपया ध्यान रखें कि सभी कार्यक्रम एक दूसरे के तहत नहीं चलेंगे। उपाय!


आप समय के लिए स्थानीय प्रणाली से नहीं पूछ रहे हैं। जो मुझे लगता है कि प्रश्न में निहित है। आप नेटवर्क कनेक्शन पर भी निर्भर करते हैं।
orkoden

2
@orkoden सवाल स्पष्ट रूप से "यूनिक्स युग 1 जनवरी 1970 के बाद से मिलीसेकंड की संख्या" के लिए पूछता है। इसके अलावा, मैं यह इंगित करने के लिए अधिक हूं कि आपको केवल समय प्राप्त करने के लिए पूरे रूबी या पायथन (या Wget) में आग कैसे नहीं लगानी चाहिए - या तो यह एक तेज चैनल के माध्यम से किया जाता है या मिलीसेकंड कोई फर्क नहीं पड़ता।
कैमिलो मार्टिन

2
हां, मैं समझ गया था कि आप खराब समाधानों की खामियों को उजागर करने के लिए बदतर समाधान दे रहे थे। मैंने कई उपाय आजमाए और समय को मापा। lpaste.net/119499 परिणाम दिलचस्प हैं। यहां तक ​​कि बहुत तेज i7 मशीन dateको चलाने के लिए 3 ms लगते हैं।
orkoden

@orkoden अच्छा परीक्षण! क्या ओएस? इस प्रक्रिया को ओवरहेड स्पॉनिंग के साथ करना पड़ सकता है।
कैमिलो मार्टिन

1
@Nakilon और यही कारण है कि किसी को भी कुछ भी उत्पादन के लिए कर्ल-सक्षम क्षमताओं पर भरोसा नहीं करना चाहिए।
कैमिलो मार्टिन

4

यह समाधान macOS पर काम करता है।

यदि आप बैश स्क्रिप्ट का उपयोग करने पर विचार करते हैं और अजगर उपलब्ध है, तो आप इस कोड का उपयोग कर सकते हैं:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

नीचे वोट क्यों?
फ्रैंक Thonig

विशेष रूप से उचित नहीं लगता। डाउन एरो पर संकेत "यह उत्तर उपयोगी नहीं है" कहता है, लेकिन IMO यह उपयोगी है। हो सकता है कि वे चाहते थे कि आप इसकी जगह एक पायथन लिपि बनाएं। यह सरल होगा और बैश कमांड के रूप में भी ठीक काम करेगा।
एंड्रयू शुलमैन

डाउनवोट्स के बारे में बहुत चिंता न करें (यह मेरा नहीं था) ... खासकर अगर वे अनाम हैं (जिसमें से कोई भी नहीं सीख सकता है कि क्या गलत है, ठीक है?)। बस आप इसे प्रोसेस करने के लिए ... यहाँ एक और +1 जाता है ... लगता है कि क्या: आपको अभी "वोट" करने की अनुमति है, है ना?
पियरे.व्रीन्स

डाउनवोट सिस्टम के साथ एक समस्या के कारण प्रतीत होता है। तब से इसे हटा दिया गया है, फिर से सिस्टम द्वारा।
माइकल हैम्पटन

2

यदि आप अपनी स्क्रिप्ट को चलाने के समय की लंबाई प्रदर्शित करने का एक तरीका ढूंढ रहे हैं, तो निम्नलिखित एक (पूरी तरह से सटीक नहीं) परिणाम प्रदान करेगा:

जैसे ही आप अपनी स्क्रिप्ट की शुरुआत कर सकते हैं, निम्नलिखित दर्ज करें

basetime=$(date +%s%N)

यह आपको 1361802943996000000 जैसे कुछ का शुरुआती मूल्य देगा

अपनी स्क्रिप्ट के अंत में, निम्नलिखित का उपयोग करें

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

जो कुछ इस तरह प्रदर्शित करेगा

runtime: 12.383 seconds

टिप्पणियाँ:

(1 * 10 ^ 09) यदि आप चाहें तो 1000000000 से बदला जा सकता है

"scale=3"यह एक दुर्लभ सेटिंग है bcजो आपको जो करना है करने के लिए मजबूर करता है। और भी बहुत कुछ हैं!

मैंने केवल Win7 / MinGW पर यह परीक्षण किया है ... मेरे पास हाथ करने के लिए एक उचित * निक्स बॉक्स नहीं है।


3
या आप बस इस्तेमाल कर सकते हैंtime <script>
वॉरेन

2

यहां बताया गया है कि विभाजन के बिना मिलीसेकंड में समय कैसे प्राप्त करें। शायद यह तेज है ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

अपडेट: शुद्ध बैश में एक और विकल्प जो केवल bash 4.2+उसी के साथ काम करता है जो ऊपर है लेकिन printfतारीख प्राप्त करने के लिए उपयोग करें। यह निश्चित रूप से तेज़ होगा क्योंकि कोई भी प्रक्रिया मुख्य से दूर नहीं होती है।

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

हालांकि एक और पकड़ यह है कि आपके strftimeकार्यान्वयन का समर्थन करना चाहिए %sऔर %Nजो मेरे परीक्षण मशीन पर ऐसा नहीं है। man strftimeसमर्थित विकल्पों के लिए देखें । सिंटैक्स देखने के man bashलिए भी देखें printf-1और -2समय के लिए विशेष मूल्य हैं।


मेरी तरह लगता है strftime(3)का समर्थन नहीं करता %Nतो के लिए कोई रास्ता नहीं printfनैनोसेकंड मुद्रित करने के लिए। मैं Ubuntu 14.04 का उपयोग कर रहा हूं।
हरदिवस

@haridsv, हाँ, यह glibc में नहीं है। dateअधिक विश्वसनीय विकल्प की तरह लगता है।
akostadinov

2

सबसे सटीक टाइमस्टैम्प हम प्राप्त कर सकते हैं (कम से कम मैक ओएस एक्स के लिए) शायद यह है:

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

लेकिन हमें यह ध्यान रखना होगा कि इसे चलाने के लिए लगभग 30 मिलीसेकंड का समय लगता है। हम इसे 2 अंकों के अंश के पैमाने पर काट सकते हैं, और बहुत शुरुआत में समय पढ़ने के औसत ओवरहेड की गणना करते हैं , और फिर माप को हटा देते हैं। यहाँ एक उदाहरण है:

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13` 
}
function getDiff {
  echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do 
  #echo -n $i 
  a=`getTimestamp`
  #echo -n "   $a"
  b=`echo "$a-$prev_a" | bc`
  prev_a=$a
  #echo "  diff=$b"
  acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"

आप यह कैसे काम करता है यह देखने के लिए इको कमांड को अनइंस्टॉल कर सकते हैं।

इस स्क्रिप्ट के परिणाम आमतौर पर इन 3 परिणामों में से एक हैं:

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

1

दिनांक और एक्सपायर का उपयोग करके आप वहां पहुंच सकते हैं

X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X

बस उस पर विस्तार करें जो आप चाहते हैं

मुझे लगता है कि यह युग के बाद से मिलीसेकंड नहीं देता है, लेकिन यह अभी भी कुछ मामलों के जवाब के रूप में उपयोगी हो सकता है, यह सब इस बात पर निर्भर करता है कि आपको वास्तव में इसके लिए क्या चाहिए, 1000 से गुणा करें यदि आपको एक मिलीसेकंड संख्या की आवश्यकता है: डी

सबसे सरल तरीका यह होगा कि आप एक छोटा निष्पादन योग्य (C f.ex. से) बनाएं और इसे स्क्रिप्ट को उपलब्ध कराएं।


एक संभावित समस्या dateकई बार चल रही है। कुछ मामलों में, जैसे ही आपकी कमांड लिखी जाती है, रनों के बीच की तारीख या समय बदल सकता है। dateएक बार चलाने और भागों को पार्स करने और अपनी गणना करने के लिए बेहतर है । ऐसा करने के कई तरीकों में से एक होगा t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"। यह बैश सिंटैक्स का उपयोग करता है क्योंकि प्रश्न टैग बैश है । जैसा कि आप अलाउड करते हैं, आपका उत्तर (और मेरी भिन्नता) केवल वर्तमान दिन के लिए सेकंड देता है अब तक और न कि युग के बाद से और न ही मिली में।
डेनिस विलियमसन

1

(ऊपर से दोहराएं) date +%NOS X पर काम नहीं करता है, लेकिन आप इसका उपयोग भी कर सकते हैं:

पर्ल (समय की आवश्यकता है :: प्रारूप मॉड्यूल)। शायद उपयोग करने के लिए सबसे अच्छा सीपीएएन मॉड्यूल नहीं है लेकिन काम हो जाता है। समय :: प्रारूप आम तौर पर वितरण के साथ उपलब्ध कराया जाता है।

perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'

ओपी ने विशेष रूप से इसे बैश का उपयोग करने के तरीके के लिए कहा। यह बैश कैसे है, कुछ और लॉन्च करने के तरीके के रूप में सहेजें?
MadHatter

मैं अपने बैश शेल स्क्रिप्ट में ... OSX के तहत इसका उपयोग करता हूं। इसलिए, dateइसका उपयोग नहीं किया जा सकता है और कोई भी बैश-केवल कमांड नहीं है जो आवश्यकता का उत्तर दे।
TVNshack

काफी उचित। यदि आप स्पष्ट करना चाहते थे कि OSX को आपके उत्तर के हिस्से के रूप में क्यों dateनहीं इस्तेमाल किया जा सकता है , तो मैं अपना डाउनवोट हटा दूंगा।
MadHatter

यह ऊपर कुछ जवाब समझाया गया था। मैं उस टिप्पणी के रूप में नहीं जोड़ सका जो प्रस्तावित सूची के साथ गायब थी। इसलिए मैंने इसे यहां जोड़ा है।
TVNshack

पर्याप्त रूप से, मैं स्वीकार करता हूं कि यह कैनन के लिए एक उपयोगी अतिरिक्त है। मुझ से +1!
मदहैटर

1

पिछले सभी प्रतिक्रियाओं को एक साथ रखते हुए, जब OSX में

ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31+

आप पसंद कर सकते हैं

microtime() {
    python -c 'import time; print time.time()'
}
compute() {
    local START=$(microtime)
    #$1 is command $2 are args
    local END=$(microtime)
    DIFF=$(echo "$END - $START" | bc)
    echo "$1\t$2\t$DIFF"
}

0

यदि आप एक सरल शेल अभिकलन अभिकलन चाहते हैं, तो उपरोक्त उत्तर का उपयोग करके यह आसान और पोर्टेबल है:

now() {
    python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514

0

अल्पाइन लाइनक्स (कई डॉकटर चित्र) और संभवतः अन्य न्यूनतम लिनक्स वातावरण के लिए आप दुरुपयोग कर सकते हैं adjtimex:

adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3

adjtimexका उपयोग करने के लिए प्रयोग किया जाता है (और सेट) कर्नेल समय चर। साथ awkआप माइक्रोसेकंड प्राप्त कर सकते हैं, के साथ headआप पहली बार 3 अंक ही उपयोग कर सकते हैं।

मुझे नहीं पता कि यह कमान कितनी विश्वसनीय है।

नोट: बेशर्मी से इस जवाब से चुरा लिया गया

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