Commande pour obtenir le temps en millisecondes

286

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

MOHAMED
la source
12
date +%s.%Nvous donnerait des nanosecondes, pouvez-vous travailler avec ça?
Wrikken
1
@Wrikken Ce n'est cependant pas tout à fait portable.
Camilo Martin
16
date + "% Y% m% d.% H% M% S% 3N" - En général, j'utilise cette commande pour obtenir le temps complet et unique jusqu'à milli secondes pour créer les noms de fichiers temporaires dans le script bash unix. Si votre système n'est pas capable de supporter des milli secondes, vous pouvez passer en micro ou nano secondes en utilisant respectivement 3 à 6 et 9.
Nitin Mahesh
Essayezdate -Ins
Dr. Person Person II

Réponses:

344

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.

Alper
la source
69
ne fonctionne pas sur Mac OS, car %Nn'est pas pris en charge pardate
yegor256
33
La question demande une commande Linux. La réponse de @ alper fonctionne très bien pour la commande date avec GNU coreutils . GNUtize votre OSX: Installez et utilisez les outils de ligne de commande GNU sur Mac OS X
caligari
77
date +%s%3Nest plus rapide (basé dans la réponse de @ michael-defort)
caligari
10
Sur OSX, vous devez installer la version GNU de date dans le cadre de l' coreutilsutilisation de MacPorts ou Homebrew - puis utilisez la gdatecommande. Voir cette question: stackoverflow.com/questions/9804966/…
Pierz
1
Bien que la date +% s% 3N semble être plus facile ou meilleure, mais son utilisation dans un autre calcul de décalage a entraîné une réduction de l'horodatage de 1 milliseconde! Mais cette solution fonctionnait parfaitement avec le calcul du décalage
Arsinux
342
  • 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 dateformat de la commande peut recevoir une largeur de champ facultative.

Michael Defort
la source
32
%xN: sympa pour la largeur du champ!
fduff
1
date + "% Y% m% d.% H% M% S% 3N" pendant milli secondes.
Nitin Mahesh
4
Je suppose que c'est une meilleure réponse que celle qui est marquée comme la bonne.
kcondezo
74

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

fedorqui 'SO arrête de nuire'
la source
Je suis tellement fier que @Peter Mortensen ait fait une de ses superbes lectures actives sur l'un de mes messages :) merci !!
fedorqui 'SO arrête de nuire'
46

Sur OS X, où datene prend pas en charge l' %Nindicateur, je recommande l'installation à l' coreutilsaide de Homebrew . Cela vous donnera accès à une commande appelée gdatequi se comportera comme datesur 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
Joshua Cook
la source
10

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.

Bastian Bittorf
la source
1
Un seul jusqu'à présent qui a fonctionné sur le XOS Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - voterait volontiers trois fois!
Cadoiz
8

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))"'
Thamme Gowda
la source
2
... cependant, une fois que vous avez 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.
Charles Duffy
4

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' %Noption 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 adjtimexet 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 adjtimexavait 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

pghalliday
la source
Wow, excellente alternative! En effet, votre commande fonctionne, mais je ne sais pas pourquoi. Où puis-je trouver une documentation pour la commande awk?! Comment diable avez-vous découvert comment construire la chaîne pour extraire les informations souhaitées de la sortie adjtimex?
Satria
Super solution de
boîte occupée
1

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;
Lorinczy Zsigmond
la source
1

Un script Python comme celui-ci:

import time
cur_time = int(time.time()*1000)
maoyang
la source
3
cela ne renverra pas le nombre de millisecondes, cela renverra le nombre de secondes exprimé en millisecondes. Tout sera $ SECONDS000
kilianc
1
Le code Python de @kilianc maoyang fournit des millisecondes.
jlliagre
@jlliagre: Mais la résolution temporelle réelle est-elle meilleure que 16-17 ms (1/60 seconde) ou non?
Peter Mortensen
Oui, Python time.time()retourne un flottant à 6 décimales, au moins sur macOS.
porglezomp
1

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 coreutilspour 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'
Chet
la source
J'aime cette solution mais je m'intéresse plus aux millis. J'ai porté cette fonction sur mon .bashrc dans ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv
1

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 -1et réglez ERRNO. 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'utiliser GetSystemTimeAsFileTime().

source: manuel GNU awk

Sur les systèmes Linux, la fonction C standard getimeofday()renvoie l'heure avec une précision en microsecondes.

kvantour
la source
0

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

Anil Agrawal
la source