मिलीसेकंड में समय पाने की आज्ञा


286

क्या मिलीसेकंड में समय पाने के लिए लिनक्स में एक शेल कमांड है?


12
date +%s.%Nआपको नैनोसेकंड देगा, क्या आप इसके साथ काम कर सकते हैं?
Wrikken

1
@Wrikken हालांकि यह काफी पोर्टेबल नहीं है।
कैमिलो मार्टिन

16
date + "% Y% m% d।% H% M% S% 3N" - आम तौर पर मैं इस कमांड का उपयोग फ़िक्लेड और यूनीक समय के लिए मिली सेकंड में अस्थायी फ़ाइल नाम को यूनिक्स बैश स्क्रिप्ट बनाने में करता हूँ। यदि आपका सिस्टम मिलि सेकंड का सामना करने में सक्षम नहीं है, तो आप क्रमशः 3 से 6 और 9 का उपयोग करके माइक्रो या नैनो सेकंड तक जा सकते हैं।
नितिन महेश

जवाबों:


344

date +%s%N सेकंड + वर्तमान नैनोसेकंड की संख्या लौटाता है।

इसलिए, echo $(($(date +%s%N)/1000000))आपको जो चाहिए।

उदाहरण:

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

date +%s युग के बाद से कुछ सेकंड की संख्या, यदि यह उपयोगी है।


69
मैक ओएस पर काम नहीं करता है, क्योंकि %Nसमर्थित नहीं हैdate
yegor256

33
लिनक्स कमांड के लिए प्रश्न पूछ रहा है। @ एल्पर का जवाब GNU कोरुटिल्स के साथ डेट कमांड के लिए ठीक काम करता है । अपने OSX को GNUtize करें: Mac OS X
कैलिगारी

77
date +%s%3Nतेज है (@ माइकल-डिफोर्ट के उत्तर के आधार पर)
कैलिगारी

10
OSX पर आपको coreutilsMacPorts या Homebrew के उपयोग के हिस्से के रूप में GNU संस्करण स्थापित करने की आवश्यकता है - फिर gdateकमांड का उपयोग करें । इस प्रश्न को देखें: stackoverflow.com/questions/9804966/…
Pierz

1
हालांकि तारीख +% s% 3N आसान या बेहतर प्रतीत होता है, लेकिन कुछ अन्य ऑफसेट गणना में इसका उपयोग करने से टाइमस्टैम्प 1 मिलीसेकंड कम हो गया! लेकिन इस समाधान ने ऑफसेट गणना के साथ एकदम सही काम किया
अर्सिनक्स

341
  • date +"%T.%N" नैनोसेकंड के साथ वर्तमान समय देता है।

    06:46:41.431857000
  • date +"%T.%6N" नैनोसेकंड के साथ वर्तमान समय को पहले 6 अंकों के साथ देता है, जो कि माइक्रोसेकंड है।

    06:47:07.183172
  • date +"%T.%3N" नैनोसेकंड के साथ वर्तमान समय को पहले 3 अंकों के लिए देता है, जो कि मिलीसेकंड है।

    06:47:42.773

सामान्य तौर पर, dateकमांड के प्रारूप के प्रत्येक क्षेत्र को एक वैकल्पिक फ़ील्ड चौड़ाई दी जा सकती है।


32
%xN: क्षेत्र की चौड़ाई के लिए अच्छा है!
fduff

1
दिनांक + "% Y% m% d। मिलि सेकंड के लिए% H% M% S% 3N"।
नितिन महेश

4
मुझे लगता है कि यह एक बेहतर जवाब है कि जो सही के रूप में चिह्नित है।
kcondezo

74

नैनो 10 and9 और मिली 10 −3 है । इसलिए, हम मिलीसेकंड प्राप्त करने के लिए नैनोसेकंड के तीन पहले पात्रों का उपयोग कर सकते हैं:

date +%s%3N

से man date:

% N नैनोसेकंड (000000000..999999999)

1970-01-01 00:00:00 UTC के बाद से % s सेकंड

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


मुझे बहुत गर्व महसूस हो रहा है कि @Peter Mortensen ने अपनी एक पोस्ट पर अपनी शानदार सक्रिय रीडिंग :) धन्यवाद !!
फेडोरक्वी 'एसओ ने

46

ओएस एक्स पर, जहां ध्वज का dateसमर्थन नहीं करता है %N, मैं होमब्रेcoreutils का उपयोग करके स्थापित करने की सलाह देता हूं । यह आपको एक कमांड को एक्सेस करने देगा जो कि लिनक्स सिस्टम पर व्यवहार करता है।gdatedate

brew install coreutils

अधिक "देशी" अनुभव के लिए, आप इसे हमेशा अपने साथ जोड़ सकते हैं .bash_aliases:

alias date='gdate'

फिर अमल करें

$ date +%s%N

10

मिलीसेकंड में समय प्राप्त करने के लिए लिनक्स के लिए किसी तरह पोर्टेबल हैक है:

#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3    # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"

millisec=$(( 10*(t2-t1) ))
echo $millisec

आउटपुट है:

3010

यह एक बहुत ही सस्ता ऑपरेशन है, जो शेल इंटर्नल और procfs के साथ काम करता है।


1
केवल एक ही अब तक जो Xeon Phi बिजीबॉक्स v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS पर काम किया है - खुशी से तीन बार बढ़ेगा!
Cadoiz

8

date कमांड एक्सट्रीम ओएस एक्स पर मिलि सेकंड प्रदान करता है, इसलिए अजगर से एक उपनाम का इस्तेमाल किया

millis(){  python -c "import time; print(int(time.time()*1000))"; }

या

alias millis='python -c "import time; print(int(time.time()*1000))"'

2
... हालाँकि, एक बार जब आप fork()एक अलग प्रक्रिया को संपादित कर लेते हैं exec, तो अपने पाइथन इंटरप्रेटर को एड करें, इसे अपने पुस्तकालयों को लोड करने दें / अन्यथा आरंभ करें, इसका परिणाम लिखें, और बाहर निकलें, यह परिणाम अब सटीक नहीं होगा।
चार्ल्स डफी

4

अन्य उत्तर संभवतः अधिकांश मामलों में पर्याप्त हैं, लेकिन मुझे लगा कि मैं अपने दो सेंट जोड़ूंगा क्योंकि मैं एक व्यस्त बॉक्स में एक समस्या में भाग गया था सिस्टम ।

विचाराधीन प्रणाली ने समर्थन नहीं किया %N प्रारूप विकल्प का और इसमें कोई पायथन या पर्ल दुभाषिया नहीं है।

बहुत सिर खुजाने के बाद, हम (धन्यवाद डेव!) इसके साथ आए:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

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

यदि आपको एक अनुगामी नई लाइन की आवश्यकता है (हो सकता है कि यह बेहतर लगे) तो प्रयास करें

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

यह भी ध्यान दें कि इसके लिए adjtimexऔर awkउपलब्ध होने की आवश्यकता है। यदि नहीं तो बिजीबॉक्स के साथ आप उन्हें स्थानीय रूप से इंगित कर सकते हैं:

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

और फिर ऊपर के रूप में कहते हैं

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

या निश्चित रूप से आप उन्हें अपने में डाल सकते हैं PATH

संपादित करें:

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

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

मैं हालांकि Ubuntu पर ऐसा नहीं करेगा। मै इस्तेमाल करूंगाdate +%s%N


वाह, बढ़िया विकल्प! वास्तव में आपकी आज्ञा काम करती है, लेकिन मेरे पास कोई सुराग क्यों नहीं है। मुझे awk कमांड के लिए डॉक्यूमेंट कहां मिलेगा ?! एडजाइम आउटपुट से वांछित जानकारी निकालने के लिए स्ट्रिंग का निर्माण कैसे करें, यह आपको कैसे पता चला?
सतरिया

बहुत बढ़िया बिजीबॉक्स समाधान
कोडबलिंग

1

इसके लिए पर्ल का उपयोग किया जा सकता है, यहां तक ​​कि एआईएक्स जैसे विदेशी प्लेटफार्मों पर भी। उदाहरण:

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw(gettimeofday);

my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime ($t_sec);

printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;

1

इस तरह एक पायथन स्क्रिप्ट:

import time
cur_time = int(time.time()*1000)

3
इससे मिलीसेकंड की संख्या वापस नहीं होगी, यह मिलीसेकंड में व्यक्त सेकंड की संख्या को लौटाएगा। सब कुछ $ SECONDS000 होगा
kilianc

1
@kilianc maoyang का पायथन कोड मिलीसेकंड प्रदान कर रहा है।
jlliagre

@ जैलियरे: लेकिन क्या वास्तविक समय संकल्प 16-17 एमएस (1/60 सेकंड) से बेहतर है या नहीं?
पीटर मोर्टेंसन

हाँ, पायथन ने time.time()6 दशमलव स्थानों पर एक फ्लोट लौटाया, कम से कम macOS पर।
porglezomp

1

मैं सिर्फ एस्पर के जवाब में जोड़ना चाहता था कि इस काम को करने के लिए मुझे क्या करना होगा:

मैक पर, आपको आवश्यकता होगी brew install coreutils, इसलिए हम उपयोग कर सकते हैं gdate। अन्यथा लिनक्स पर, यह सिर्फ है date। और यह फ़ंक्शन अस्थायी फ़ाइलों या कुछ भी बनाने के लिए बिना समय कमांड की मदद करेगा:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

और आप इसे एक तार के साथ उपयोग कर सकते हैं:

timeit 'tsc --noEmit'

मुझे यह समाधान पसंद है लेकिन मुझे मिलिस में अधिक दिलचस्पी है। मैंने इस समारोह को ubuntu में अपने .bashrc में भेज दिया:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
उलुआइव

1

जब आप 4.1 संस्करण से GNU AWK का उपयोग करते हैं, तो आप समय पुस्तकालय लोड कर सकते हैं और कर सकते हैं:

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

यह 1970-01-01T00: 00: 00 के बाद से सेकंड सेकंड में वर्तमान समय को प्रिंट करेगा।

the_time = gettimeofday() 1970-01-01 UTC से एक अस्थायी बिंदु मान के रूप में समाप्त होने वाले सेकंड में समय लौटाएं। यदि इस प्लेटफ़ॉर्म पर समय अनुपलब्ध है, तो वापस लौटें -1और सेट करें ERRNOलौटे समय में उप-सेकंड की सटीकता होनी चाहिए , लेकिन वास्तविक सटीकता प्लेटफ़ॉर्म के आधार पर भिन्न हो सकती है। यदि gettimeofday()इस प्लेटफ़ॉर्म पर मानक C सिस्टम कॉल उपलब्ध है, तो यह केवल मान लौटाता है। अन्यथा, यदि एमएस-विंडोज पर, यह उपयोग करने की कोशिश करता है GetSystemTimeAsFileTime()

स्रोत: GNU awk मैनुअल

लिनक्स सिस्टम पर, मानक सी फ़ंक्शन getimeofday()माइक्रोसेकंड सटीकता में समय लौटाता है।


0

समय और समय-क्षेत्र के साथ तारीख दिखाने के लिए

दिनांक + "% d-% m-% Y% T.% N% Z"

आउटपुट: 22-04-2020 18: 01: 35.970289239 IST

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