Vraag Hoe de huidige Unix-tijd in milliseconden in bash te krijgen?


Hoe krijg ik de huidige Unix-tijd in milliseconden (d.w.z. het aantal milliseconden sinds Unix tijdperk 1 januari 1970)?


197
2018-06-14 16:04


oorsprong




antwoorden:


Deze:

date +%s 

zal het aantal terugsturen seconden sinds het tijdperk.

Deze:

date +%s%N

geeft de seconden en de huidige nanoseconden terug.

Zo:

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

geeft je het aantal milliseconden sinds het tijdperk - huidige seconden plus de linker drie van de nanoseconden.


en van MikeyB - echo $(($(date +%s%N)/1000000)) (delen door 1000 levert slechts microseconden op)


233
2018-06-14 16:10



Ik vraag me af hoeveel ms de cut toevoegt :-) - Kyle Brandt♦
Of als je het allemaal in de shell wilt doen, en de dure overhead van een extra proces wilt vermijden (in feite vermijden we het probleem wanneer het aantal cijfers in% + s + N verandert): echo $(($(date +%s%N)/1000)) - MikeyB
Het is het principe van de zaak ... vermijd magische getallen en codeer wat je eigenlijk bent gemiddelde. - MikeyB
Ik denk dat het de moeite loont om op te merken dat de man vroeg om Unix, niet om Linux, en dat het huidige topantwoord (date +% s% N) niet werkt op mijn AIX-systeem. - Pete
@Pete +1 Hetzelfde voor OS X en FreeBSD - ocodo


Je kunt het gewoon gebruiken %3N om de nanoseconden af ​​te korten tot de 3 meest significante cijfers (die dan milliseconden zijn):

$ date +%s%3N
1397392146866

Dit werkt b.v. op mijn kubuntu 12.04.

Maar let op, dat %N mogelijk niet geïmplementeerd, afhankelijk van uw doelsysteem. Bijv. getest op een ingebed systeem (buildroot rootfs, gecompileerd met behulp van een niet-HF arm cross toolchain) was er geen %N:

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

(En ook mijn (niet-geroote) Android-tablet heeft nee %N).


79
2018-04-13 12:34



@warren: Ik zag dat je het bestand hebt bewerkt en gewijzigd 1397392146%3N naar 1397392146%N, maar de uitvoer van 1397392146%3N is dat wat ik echt had gezien op de busybox-console van mijn Android-tablet. Zou je je bewerking kunnen uitleggen? - Joe
warren's commentaar uit de geschiedenis is "veranderd van 3 naar 6, omdat 3 je alleen naar microseconden brengt". Zijn bewerking lijkt volkomen onecht; je zou het terug moeten rollen. - bukzor
Dit is specifiek een kenmerk van GNU coreutils. Uiteindelijk wordt dit hier in gnulib geïmplementeerd: github.com/gagern/gnulib/blob/.... - telotortium
waarschijnlijk is een punt daar logisch. date +%s.%3N prints 1510718281.134. - darksky


date +%N werkt niet op OS X, maar u kunt een van gebruiken

  • robijn: ruby -e 'puts Time.now.to_f'
  • Python: python -c 'import time; print time.time()'
  • node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • de internets: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • of voor milliseconden afgerond op de dichtstbijzijnde seconde date +%s000

51
2017-09-02 11:16



voor de volledigheid... node -e 'console.log(Date.now())' - slf
PHP gebruiken: php -r 'echo microtime(TRUE);' - TachyonVortex
Natuurlijk, je hoeft alleen maar te wachten tot die tolken zich opwarmen. Dit werkt ook: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
Of, als u heb niet echt de milliseconden nodig maar alleen het juiste formaat: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/... heeft instructies om dit in OSX te doen via Brew's coreutils - sameers


Ik gooi dit gewoon naar buiten, maar ik denk dat de juiste formule met de verdeling zou zijn:

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

8
2017-09-07 21:22





Mijn oplossing is niet de beste, maar werkte voor mij.

date +%s000

Ik moest alleen een datum zoals 2012-05-05 converteren naar milliseconden.


6
2018-05-09 20:11



Geweldige hack, lol :) - k06a
Je moet iemand van mijn collega's zijn. - Nakilon


Voor de mensen die stellen voor het uitvoeren van externe programma's om de milliseconden ... tegen die snelheid, kunt u net zo goed dit doen:

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

Richtpunt is: voordat u een antwoord van hier kiest, houd er dan rekening mee dat niet alle programma's onder een hele seconde zullen worden uitgevoerd. Maatregel!


6
2018-06-23 13:17



Je vraagt ​​het lokale systeem niet naar de tijd. Wat ik vermoed is geïmpliceerd in de vraag. U bent ook afhankelijk van een netwerkverbinding. - orkoden
@orkoden De vraag vraagt ​​expliciet om "aantal milliseconden sinds Unix tijdperk 1 januari 1970". Ik wil er ook meer op wijzen dat je nooit helemaal Ruby of Python (of wget) moet opstarten om de tijd te krijgen - ofwel gebeurt dit via een snel kanaal of milliseconden doet er niet toe. - Camilo Martin
Ja, ik heb begrepen dat u een slechtere oplossing gaf om de tekortkomingen van de slechte oplossingen onder de aandacht te brengen. Ik heb verschillende oplossingen geprobeerd en de tijd gemeten. lpaste.net/119499 De resultaten zijn best interessant. Zelfs op een zeer snelle i7-machine date duurt 3 ms te lopen. - orkoden
@orkoden Mooi getest! Welk besturingssysteem? Dit kan te maken hebben met het proces dat boven de spawnt. - Camilo Martin
@Nakilon en dit is waarom men niet op krulbare gemakken zoals die voor om het even welke productie zou moeten vertrouwen. - Camilo Martin


deze oplossing werkt op macOS.

als je overweegt een bash-script te gebruiken en python beschikbaar hebt, kun je deze code gebruiken:

#!/bin/bash

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

3
2018-02-05 14:26



waarom de neerwaartse stemming? - Frank Thonig
Lijkt niet bijzonder gerechtvaardigd. De hint op de pijl naar beneden zegt: "Dit antwoord is niet nuttig", maar IMO is nuttig. Misschien wilden ze dat je er een Python-script van maakte. Dat zou eenvoudiger zijn en ook prima werken als bashcommando. - Andrew Schulman
Maak je geen zorgen te veel over downvotes (het was niet de mijne) ... vooral als ze anoniem zijn (van waaruit men niet kan leren wat er mis lijkt te zijn, toch?). Gewoon om te hlep je verwerken ... hier gaat nog een +1 ... raad eens: JIJ mag ook nu "stemmen", toch? - Pierre.Vriens
Het downvote lijkt te zijn veroorzaakt door een probleem met het systeem. Het is sindsdien verwijderd, opnieuw door het systeem. - Michael Hampton♦


Als u op zoek bent naar een manier om de tijdsduur weer te geven dat uw script is uitgevoerd, biedt het volgende een (niet volledig correct) resultaat:

Voer zo snel mogelijk het begin van uw script in

basetime=$(date +%s%N)

Dit geeft je een startwaarde van zoiets als 1361802943996000000

Gebruik het volgende aan het einde van uw script

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

die iets als zal weergeven

runtime: 12.383 seconds

Opmerkingen:

(1 * 10 ^ 09) kan worden vervangen door 1000000000 als u dat wenst

"scale=3" is een vrij zeldzame instelling die dwingt bc om te doen wat je wilt. Er zijn nog veel meer!

Ik heb dit alleen getest op Win7 / MinGW ... Ik heb geen echt * nix-vak bij de hand.


2
2018-02-25 14:48



of je zou gewoon kunnen gebruiken time <script> - warren


Hier leest u hoe u tijd kunt krijgen in milliseconden zonder divisie uit te voeren. Misschien is het sneller ...

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

Update: een ander alternatief in pure bash dat alleen werkt met bash 4.2+ is hetzelfde als hierboven maar gebruik printf om de datum te krijgen. Het zal zeker sneller zijn omdat geen processen worden afgegraven van de hoofdprocessen.

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

Een andere vangst hier is echter dat je strftime implementatie zou moeten ondersteunen %s en %N wat NIET het geval is op mijn testmachine. Zien man strftime voor ondersteunde opties. Zie ook man bashzien printf syntaxis. -1 en -2 zijn speciale waarden voor tijd.


2
2018-02-10 09:05



Het lijkt op mijn strftime(3) ondersteunt niet %N dus geen manier voor printf om nanoseconden af ​​te drukken. Ik gebruik Ubuntu 14.04. - haridsv
@haridsv, ja, het is niet in glibc. date lijkt de betrouwbaarder optie. - akostadinov


De meest accurate tijdstempel die we kunnen krijgen (in ieder geval voor Mac OS X) is waarschijnlijk dit:

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

1490665305.021699

Maar we moeten in gedachten houden dat het ongeveer 30 milliseconden duurt om te draaien. We kunnen het op de schaal van 2 cijfers delen en aan het begin de gemiddelde overhead van het lezen van de tijd en verwijder deze dan van de meting. Hier is een voorbeeld:

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`"

U kunt reageren op de echo-opdrachten om beter te zien hoe het werkt.

De resultaten voor dit script zijn meestal een van deze 3 resultaten:

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

2
2018-03-28 02:13