Existe-t-il une commande shell sous Linux pour obtenir l'heure en millisecondes?
date -Ins
Existe-t-il une commande shell sous Linux pour obtenir l'heure en millisecondes?
date -Ins
Réponses:
date +%s%N
renvoie le nombre de secondes + nanosecondes actuelles.
Par conséquent, echo $(($(date +%s%N)/1000000))
c'est ce dont vous avez besoin.
Exemple:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
renvoie le nombre de secondes depuis l'époque, si cela est utile.
%N
n'est pas pris en charge pardate
date +%s%3N
est plus rapide (basé dans la réponse de @ michael-defort)
coreutils
utilisation de MacPorts ou Homebrew - puis utilisez la gdate
commande. Voir cette question: stackoverflow.com/questions/9804966/…
date +"%T.%N"
renvoie l'heure actuelle en nanosecondes.
06:46:41.431857000
date +"%T.%6N"
renvoie l'heure actuelle avec des nanosecondes arrondies aux 6 premiers chiffres, qui sont des microsecondes.
06:47:07.183172
date +"%T.%3N"
renvoie l'heure actuelle avec des nanosecondes arrondies aux 3 premiers chiffres, qui sont des millisecondes.
06:47:42.773
En général, chaque champ du date
format de la commande peut recevoir une largeur de champ facultative.
%xN
: sympa pour la largeur du champ!
Nano est 10 −9 et milli 10 −3 . Par conséquent, nous pouvons utiliser les trois premiers caractères des nanosecondes pour obtenir les millisecondes:
date +%s%3N
De man date
:
% N nanosecondes (000000000..999999999)
% s secondes depuis le 1970-01-01 00:00:00 UTC
Source: Server Fault's Comment obtenir l'heure Unix actuelle en millisecondes dans Bash? .
Sur OS X, où date
ne prend pas en charge l' %N
indicateur, je recommande l'installation à l' coreutils
aide de Homebrew . Cela vous donnera accès à une commande appelée gdate
qui se comportera comme date
sur les systèmes Linux.
brew install coreutils
Pour une expérience plus "native", vous pouvez toujours ajouter ceci à votre .bash_aliases
:
alias date='gdate'
Ensuite, exécutez
$ date +%s%N
Voici un hack portable pour Linux pour gagner du temps en millisecondes:
#!/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
La sortie est:
3010
Il s'agit d'une opération très bon marché, qui fonctionne avec les internes du shell et les procfs.
date
la commande n'a pas fourni de milli secondes sur OS X, donc utilisé un alias de python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
OU
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
supprimé un processus distinct, exec
éditez votre interpréteur Python, laissez-le charger ses bibliothèques / sinon initialiser, écrire son résultat et quitter, ce résultat ne sera plus précis.
Les autres réponses sont probablement suffisantes dans la plupart des cas, mais j'ai pensé ajouter mes deux cents car j'ai rencontré un problème sur un système BusyBox .
Le système en question ne prend pas en charge l' %N
option de format et n'a pas d'interpréteur Python ou Perl.
Après avoir beaucoup gratté la tête, nous (merci Dave!) Avons trouvé ceci:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Il extrait les secondes et les microsecondes de la sortie de adjtimex
(normalement utilisé pour définir les options de l'horloge système) et les imprime sans nouvelles lignes (afin qu'elles soient collées ensemble). Notez que le champ microsecondes doit être pré-rempli avec des zéros, mais cela n'affecte pas le champ secondes qui est plus long que six chiffres de toute façon. De là, il devrait être trivial de convertir des microsecondes en millisecondes.
Si vous avez besoin d'une nouvelle ligne de fin (peut-être parce qu'elle semble meilleure), essayez
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Notez également que cela nécessite adjtimex
et awk
être disponible. Sinon, avec BusyBox, vous pouvez les pointer localement avec:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Et puis appelez ce qui précède comme
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Ou bien sûr, vous pouvez les mettre dans votre PATH
ÉDITER:
Ce qui précède a fonctionné sur mon appareil BusyBox. Sur Ubuntu, j'ai essayé la même chose et j'ai réalisé qu'il y adjtimex
avait différentes versions. Sur Ubuntu, cela fonctionnait pour afficher le temps en secondes avec des décimales en microsecondes (y compris une nouvelle ligne de fin)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Je ne ferais pas cela sur Ubuntu. j'utiliseraisdate +%s%N
Perl peut être utilisé pour cela, même sur des plateformes exotiques comme AIX. Exemple:
#!/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;
Un script Python comme celui-ci:
import time
cur_time = int(time.time()*1000)
time.time()
retourne un flottant à 6 décimales, au moins sur macOS.
Je voulais juste ajouter à la réponse d' Alper ce que je devais faire pour que ces choses fonctionnent:
Sur Mac, vous en aurez besoin brew install coreutils
pour que nous puissions l'utiliser gdate
. Sinon sous Linux, c'est juste date
. Et cette fonction vous aidera à chronométrer les commandes sans avoir à créer de fichiers temporaires ou quoi que ce soit:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Et vous pouvez l'utiliser avec une chaîne:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Lorsque vous utilisez GNU AWK depuis la version 4.1, vous pouvez charger la bibliothèque de temps et faire:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Cela imprime l'heure actuelle en secondes depuis le 1970-01-01T00: 00: 00 avec une précision inférieure à la seconde.
the_time = gettimeofday()
Renvoie le temps en secondes écoulé depuis le 1970-01-01 UTC sous forme de valeur à virgule flottante. Si l'heure n'est pas disponible sur cette plateforme, revenez-1
et réglezERRNO
. Le temps renvoyé doit avoir une précision inférieure à la seconde , mais la précision réelle peut varier en fonction de la plate-forme. Si l'gettimeofday()
appel système C standard est disponible sur cette plate-forme, il renvoie simplement la valeur. Sinon, si sur MS-Windows, il essaie d'utiliserGetSystemTimeAsFileTime()
.source: manuel GNU awk
Sur les systèmes Linux, la fonction C standard getimeofday()
renvoie l'heure avec une précision en microsecondes.
Pour afficher la date avec l'heure et le fuseau horaire
date + "% d-% m-% Y% T.% N% Z"
Sortie: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
vous donnerait des nanosecondes, pouvez-vous travailler avec ça?