Is er een shell-opdracht in Linux om de tijd in milliseconden te krijgen?
Antwoord 1, autoriteit 100%
-
date +"%T.%N"
geeft de huidige tijd met nanoseconden.06:46:41.431857000
-
date +"%T.%6N"
retourneert de huidige tijd met nanoseconden afgerond op de eerste 6 cijfers, wat microseconden is.06:47:07.183172
-
date +"%T.%3N"
retourneert de huidige tijd met nanoseconden afgerond op de eerste 3 cijfers, wat milliseconden is.06:47:42.773
Over het algemeen kan aan elk veld van de opdracht date
een optionele veldbreedte worden gegeven.
Antwoord 2, autoriteit 94%
date +%s%N
geeft het aantal seconden + huidige nanoseconden terug.
Daarom is echo $(($(date +%s%N)/1000000))
wat je nodig hebt.
Voorbeeld:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
retourneert het aantal seconden sinds het tijdperk, als dat nuttig is.
Antwoord 3, autoriteit 23%
Nano is 10−9en milli 10−3. Daarom kunnen we de drie eerste tekens van nanoseconden gebruiken om de milliseconden te krijgen:
date +%s%3N
Van man date
:
%Nnanoseconden (000000000..999999999)
%sseconden sinds 1970-01-01 00:00:00 UTC
Bron: Serverfout Hoe krijg ik de huidige Unix-tijd in milliseconden in Bash?.
Antwoord 4, autoriteit 16%
Op OS X, waar date
de vlag %N
niet ondersteunt, raad ik aan coreutils
te installeren met Homebrew. Dit geeft je toegang tot een commando genaamd gdate
dat zich zal gedragen zoals date
doet op Linux-systemen.
brew install coreutils
Voor een meer “native” ervaring, kun je dit altijd toevoegen aan je .bash_aliases
:
alias date='gdate'
Voer vervolgens uit
$ date +%s%N
Antwoord 5, autoriteit 5%
Hier is een op de een of andere manier draagbare hack voor Linux om tijd in milliseconden te krijgen:
#!/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
De uitvoer is:
3010
Dit is een erg goedkope operatie, die werkt met shell internals en procfs.
Antwoord 6, autoriteit 2%
date
-opdracht leverde geen milliseconden op in OS X, dus gebruikte een alias van python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
OF
alias millis='python -c "import time; print(int(time.time()*1000))"'
EDIT: naar aanleiding van de opmerking van @CharlesDuffy.
Het afsplitsen van elk kindproces kost extra tijd.
$ time date +%s%N
1597103627N
date +%s%N 0.00s user 0.00s system 63% cpu 0.006 total
Python is nog steeds verbeterd zijn VM-starttijd , en het is niet zo snel als vooruit -Tijd gecompileerde code (zoals date
).
Op mijn machine duurde het ongeveer 30ms – 60ms (dat is 5x-10x van 6 ms genomen door date
)
$ time python -c "import time; print(int(time.time()*1000))"
1597103899460
python -c "import time; print(int(time.time()*1000))" 0.03s user 0.01s system 83% cpu 0.053 total
Ik bedacht awk
is lichtgewicht dan python
, dus awk
kost het bereik van 6ms tot 12ms (ie 1x tot 2x van datum) :
$ time awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'
1597103729525
awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}' 0.00s user 0.00s system 74% cpu 0.010 total
Antwoord 7, Autoriteit 2%
De andere antwoorden zijn waarschijnlijk voldoende in de meeste gevallen, maar ik dacht dat ik mijn twee cent zou toevoegen omdat ik een probleem tegenkwam op een businessbox systeem.
Het betreffende systeem ondersteunde de optie %N
niet en heeft geen Python of Perl-tolk.
Na veel kop krassen, wij (bedankt Dave!) Kamen dit met deze:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Het haalt de seconden en microseconden uit de uitvoer van adjtimex
(normaal gebruikt om opties voor de systeemklok in te stellen) en drukt ze zonder nieuwe regels (zodat ze samen worden gelijmd). Merk op dat het veld MicroSeconds vooraf wordt opgevuld met nullen, maar dit heeft geen invloed op het veld Seconds die hoe dan ook langer is dan zes cijfers. Hieruit moet het triviaal zijn om microseconden te converteren naar milliseconden.
Als je een trailing nieuwe regel nodig hebt (misschien omdat het er beter uitziet), probeer dan
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Merk ook op dat dit vereist is adjtimex
en awk
om beschikbaar te zijn. Zo niet, dan met de drukkoffbox, kunt u er lokaal op wijzen met:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
en bel dan het bovenstaande als
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
of natuurlijk kunt u ze in uw PATH
plaatsen
EDIT:
Het bovenstaande werkte op mijn businessbox-apparaat. Op Ubuntu probeerde ik hetzelfde en besefte ik dat adjtimex
verschillende versies heeft. Op Ubuntu werkte dit de tijd om de tijd in seconden met decimale plaatsen naar microseconds (inclusief een trailing nieuwe regel)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Ik zou dit echter niet op ubuntu doen. Ik zou gebruiken date +%s%N
Antwoord 8
Om de datum te tonen met tijd en tijdzone
Datum + “% D-% M-% Y% T.% n% z”
OUTPUT: 22-04-2020 18: 01: 35.970289239 IST
Antwoord 9
Pure Bash-oplossing
Sinds bash
5.0 (Vrijgegeven op 7 januari 2019 ) U kunt de ingebouwde variabele EPOCHREALTIME
gebruiken die de seconden sinds het tijdperk bevat, inclusief decimale plaatsen tot Micro-Second (μS) Precision (echo $EPOCHREALTIME
Drukt iets af als 1547624774.371215
). Door de .
en de laatste drie plaatsen krijgen we milliseconden:
Gebruik ofwel
(( t = ${EPOCHREALTIME/./} / 1000 ))
of zoiets als
t=${EPOCHREALTIME/./}
t=${t%???}
Hoe dan ook t
zal zoiets zijn als 1547624774371
.
Antwoord 10
Ik wilde alleen toevoegen aan Alper’s antwoordwat Ik moest doen om dit spul werkend te krijgen:
Op Mac heb je brew install coreutils
nodig, zodat we gdate
kunnen gebruiken. Anders is het op Linux gewoon date
. En deze functie helpt je tijdcommando’s te maken zonder dat je tijdelijke bestanden of iets dergelijks hoeft te maken:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
En je kunt het gebruiken met een string:
timeit 'tsc --noEmit'
Antwoord 11
Perl kan hiervoor worden gebruikt, zelfs op exotische platforms zoals AIX. Voorbeeld:
#!/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;
Antwoord 12
Een Python-script zoals dit:
import time
cur_time = int(time.time()*1000)
Antwoord 13
Als u GNU AWK gebruikt sinds versie 4.1, kunt u de tijdbibliotheek laden en het volgende doen:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Hiermee wordt de huidige tijd in seconden afgedrukt sinds 01-01-1900T00:00:00 met een nauwkeurigheid van minder dan een seconde.
the_time = gettimeofday()
Retourneert de tijd in seconden die is verstreken sinds 1970/01/01 UTC als een drijvende-kommawaarde. Als de tijd niet beschikbaar is op dit platform, retourneer dan-1
en stelERRNO
in. De geretourneerde tijd moet een precisie hebben van minder dan een seconde, maar de werkelijke precisie kan variëren op basis van het platform. Als de standaard Cgettimeofday()
systeemaanroep beschikbaar is op dit platform, dan retourneert het gewoon de waarde. Anders probeert het bij MS-WindowsGetSystemTimeAsFileTime()
te gebruiken.bron: GNU awk handleiding
Op Linux-systemen retourneert de standaard C-functie getimeofday()
de tijd in microseconden nauwkeurigheid.
Antwoord 14
Ik wil waarde genereren uit bash en die waarde gebruiken in Java-code om terug te converteren naar date(java.util).
Het volgende commando werkt voor mij om de waarde in het bash-bestand te genereren:
date +%s000
Antwoord 15
Om decimale seconden af te drukken:
start=$(($(date +%s%N)/1000000)) \
&& sleep 2 \
&& end=$(($(date +%s%N)/1000000)) \
&& runtime=$((end - start))
divisor=1000 \
&& foo=$(printf "%s.%s" $(( runtime / divisor )) $(( runtime % divisor ))) \
&& printf "runtime %s\n" $foo # in bash integer cannot cast to float
Uitvoer: runtime 2.3