Opdracht om tijd in milliseconden te krijgen

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 dateeen optionele veldbreedte worden gegeven.


Antwoord 2, autoriteit 94%

date +%s%Ngeeft 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 +%sretourneert 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 datede vlag %Nniet ondersteunt, raad ik aan coreutilste installeren met Homebrew. Dit geeft je toegang tot een commando genaamd gdatedat zich zal gedragen zoals datedoet 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 awkis lichtgewicht dan python, dus awkkost 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 %Nniet 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 adjtimexen awkom 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 adjtimexverschillende 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 bash5.0 (Vrijgegeven op 7 januari 2019 ) U kunt de ingebouwde variabele EPOCHREALTIMEgebruiken die de seconden sinds het tijdperk bevat, inclusief decimale plaatsen tot Micro-Second (μS) Precision (echo $EPOCHREALTIMEDrukt 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 tzal 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 coreutilsnodig, zodat we gdatekunnen 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 -1en stel ERRNOin. 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 C gettimeofday()systeemaanroep beschikbaar is op dit platform, dan retourneert het gewoon de waarde. Anders probeert het bij MS-Windows GetSystemTimeAsFileTime()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

Other episodes