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.
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.
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:
... 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:
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
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)
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;
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:
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:
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().
date +%s.%N
vous donnerait des nanosecondes, pouvez-vous travailler avec ça?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:
date +%s
renvoie le nombre de secondes depuis l'époque, si cela est utile.la source
%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 lagdate
commande. Voir cette question: stackoverflow.com/questions/9804966/…date +"%T.%N"
renvoie l'heure actuelle en nanosecondes.date +"%T.%6N"
renvoie l'heure actuelle avec des nanosecondes arrondies aux 6 premiers chiffres, qui sont des microsecondes.date +"%T.%3N"
renvoie l'heure actuelle avec des nanosecondes arrondies aux 3 premiers chiffres, qui sont des millisecondes.En général, chaque champ du
date
format de la commande peut recevoir une largeur de champ facultative.la source
%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:
De
man date
:Source: Server Fault's Comment obtenir l'heure Unix actuelle en millisecondes dans Bash? .
la source
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éegdate
qui se comportera commedate
sur les systèmes Linux.Pour une expérience plus "native", vous pouvez toujours ajouter ceci à votre
.bash_aliases
:Ensuite, exécutez
la source
Voici un hack portable pour Linux pour gagner du temps en millisecondes:
La sortie est:
Il s'agit d'une opération très bon marché, qui fonctionne avec les internes du shell et les procfs.
la source
date
la commande n'a pas fourni de milli secondes sur OS X, donc utilisé un alias de pythonOU
la source
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:
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
Notez également que cela nécessite
adjtimex
etawk
être disponible. Sinon, avec BusyBox, vous pouvez les pointer localement avec:Et puis appelez ce qui précède comme
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)Je ne ferais pas cela sur Ubuntu. j'utiliserais
date +%s%N
la source
Perl peut être utilisé pour cela, même sur des plateformes exotiques comme AIX. Exemple:
la source
Un script Python comme celui-ci:
la source
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'utilisergdate
. Sinon sous Linux, c'est justedate
. Et cette fonction vous aidera à chronométrer les commandes sans avoir à créer de fichiers temporaires ou quoi que ce soit:Et vous pouvez l'utiliser avec une chaîne:
la source
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:
Cela imprime l'heure actuelle en secondes depuis le 1970-01-01T00: 00: 00 avec une précision inférieure à la seconde.
Sur les systèmes Linux, la fonction C standard
getimeofday()
renvoie l'heure avec une précision en microsecondes.la source
Pour afficher la date avec l'heure et le fuseau horaire
Sortie: 22-04-2020 18: 01: 35.970289239 IST
la source