Existe-t-il une commande Shell sous Linux pour obtenir l'heure en millisecondes?
date +%s%N
renvoie le nombre de secondes + nanosecondes actuelles.
Par conséquent, echo $(($(date +%s%N)/1000000))
est ce dont vous avez besoin.
ex:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
renvoie le nombre de secondes depuis l'époque, si cela est utile
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, ce qui correspond à des microsecondes.
06:47:07.183172
date +"%T.%3N"
renvoie l'heure actuelle avec des nanosecondes arrondies aux 3 premiers chiffres, ce qui correspond à des millisecondes.
06:47:42.773
En général, une largeur de champ facultative peut être attribuée à chaque champ du format de la commande date
.
nano a 10 ans−9 et milli 10−3. Par conséquent, nous pouvons utiliser les 3 premiers caractères de nanosecondes pour obtenir le milli:
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 actuelle d'Unix en millisecondes avec bash? .
Sous OS X, où date
ne prend pas en charge l'indicateur %N
, je vous recommande d'installer coreutils
à l'aide de homebrew . Cela vous donnera accès à une commande appelée gdate
qui se comportera comme le fait 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'
puis exécuter
$ date +%s%N
La commande date
ne fournissait pas des millisecondes sous OS X, donc un alias de python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
OR
alias millis='python -c "import time; print(int(time.time()*1000))"'
Les autres réponses sont probablement suffisantes dans la plupart des cas, mais je pensais ajouter mes 2 centimes car je rencontrais un problème sur un système busybox.
Le système en question ne prend pas en charge l'option de formatage %N
et ne dispose d'aucun interpréteur python
ou Perl
.
Après beaucoup de maux de tête, nous remercions Dave (merci Dave!):
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Il extrait les secondes et les microsecondes de la sortie de adjtimex
(utilisé normalement pour définir les options de l'horloge système) et les affiche sans nouvelles lignes (afin qu'elles soient collées ensemble). Notez que le champ de microsecondes doit être pré-rempli avec des zéros, mais cela n’affecte pas le champ de secondes qui est plus long que 6 chiffres de toute façon. À partir de cela, il devrait être facile de convertir des microsecondes en millisecondes.
Si vous avez besoin d’une nouvelle ligne de fuite (peut-être parce qu’elle a meilleure apparence), essayez
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Notez également que cela nécessite que adjtimex
et awk
soient disponibles. Sinon, avec busybox, vous pouvez les indiquer localement avec
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Et 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
MODIFIER:
Ce qui précède a fonctionné sur mon périphérique busybox. Sur Ubuntu, j'ai essayé la même chose et compris que adjtimex
avait des versions différentes. Sur Ubuntu, cela fonctionnait pour afficher le temps en secondes avec des décimales à quelques microsecondes (y compris une nouvelle ligne).
Sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Je ne ferais pas cela sur Ubuntu cependant. Je voudrais utiliser date +%s%N
voici un hack portable pour Linux pour obtenir le 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
c'est une opération très économique qui fonctionne avec les internes de Shell et procfs
Je voulais juste ajouter à la réponse de @ Alper ce que je devais faire pour que cela fonctionne:
Sur Mac, vous aurez besoin de brew install coreutils
pour pouvoir 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 ni 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'
Perl peut être utilisé à cet effet, même sur des plates-formes 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;
script python comme ceci:
import time
cur_time = int(time.time()*1000)