web-dev-qa-db-fra.com

Commande pour obtenir le temps en millisecondes

Existe-t-il une commande Shell sous Linux pour obtenir l'heure en millisecondes?

212
MOHAMED

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

279
Alper
  • 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.

258
Michael Defort

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? .

59
fedorqui

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
37
Joshua Cook

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))"'
6
Thamme Gowda

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

4
pghalliday

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

2
Bastian Bittorf

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'

0
Chet

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;
0
Lorinczy Zsigmond

script python comme ceci:

import time
cur_time = int(time.time()*1000)
0
maoyang