Question Comment obtenir l'heure actuelle d'Unix en millisecondes en bash?


Comment obtenir l'heure actuelle d'Unix en millisecondes (c'est-à-dire le nombre de millisecondes depuis la période Unix du 1er janvier 1970)?


197
2018-06-14 16:04


origine




Réponses:


Ce:

date +%s 

retournera le nombre de secondes depuis l'époque.

Ce:

date +%s%N

renvoie les secondes et les nanosecondes actuelles.

Alors:

date +%s%N | cut -b1-13

vous donnera le nombre de millisecondes depuis l'époque - secondes actuelles plus les trois nanosecondes à gauche.


et de MikeyB - echo $(($(date +%s%N)/1000000)) (diviser par 1000 n'apporte que des microsecondes)


233
2018-06-14 16:10



Je me demande combien de ms la coupe ajoute :-) - Kyle Brandt♦
Ou si vous voulez tout faire dans le shell, en évitant la surcharge d'un processus supplémentaire (en fait, nous évitons le problème lorsque le nombre de chiffres dans% + s + N change): echo $(($(date +%s%N)/1000)) - MikeyB
C'est le principe de la matière ... évitez les nombres magiques et codez ce que vous avez réellement signifier. - MikeyB
Je pense que cela vaut la peine de noter que l'homme a demandé Unix, pas Linux, et que la réponse actuelle (date +% s% N) ne fonctionne pas sur mon système AIX. - Pete
@Pete +1 Idem pour OS X et FreeBSD - ocodo


Vous pouvez simplement utiliser %3N tronquer les nanosecondes aux 3 chiffres les plus significatifs (qui sont alors des millisecondes):

$ date +%s%3N
1397392146866

Cela fonctionne par exemple sur mon kubuntu 12.04.

Mais sachez que %N peut ne pas être implémenté en fonction de votre système cible. Par exemple. testé sur un système intégré (rootrois, compilé à l’aide d’une chaîne d’outils croisés non-HF), il n’existait pas %N:

$ date +%s%3N
1397392146%3N

(Et aussi ma tablette Android (non enracinée) n'a pas %N).


79
2018-04-13 12:34



@ Warren: J'ai vu que vous avez édité et changé le 1397392146%3N à 1397392146%N, mais la sortie de 1397392146%3N est-ce ce que j'avais vraiment vu sur la console busybox de ma tablette Android. Pourriez-vous expliquer votre édition? - Joe
Le commentaire de Warren dans l'historique est "changé de 3 à 6, car 3 ne vous emmène qu'en microsecondes". Son édition semble totalement fausse; vous devriez le faire reculer. - bukzor
C’est une fonctionnalité de GNU coreutils en particulier. En fin de compte, cela est implémenté dans gnulib ici: github.com/gagern/gnulib/blob/…. - telotortium
probablement un point a du sens. date +%s.%3N empreintes 1510718281.134. - darksky


date +%N ne fonctionne pas sous OS X, mais vous pouvez utiliser l'un des

  • rubis: ruby -e 'puts Time.now.to_f'
  • python: python -c 'import time; print time.time()'
  • node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • les internets: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • ou pendant des millisecondes arrondies à la seconde près date +%s000

51
2017-09-02 11:16



pour être complet ... node -e 'console.log(Date.now())' - slf
Utiliser PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
Bien sûr, vous devez simplement attendre que ces interprètes se réchauffent. Cela fonctionne aussi: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
Ou si vous n'a pas réellement besoin des millisecondes mais juste le bon format: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/… a des instructions pour le faire dans OSX via Brew's coreutils - sameers


Il suffit de jeter cela dehors, mais je pense que la formule correcte avec la division serait:

echo $(($(date +%s%N)/1000000))

8
2017-09-07 21:22





Ma solution n'est pas la meilleure mais a fonctionné pour moi.

date +%s000

Je devais simplement convertir une date comme le 2012-05-05 en millisecondes.


6
2018-05-09 20:11



Bidouille incroyable, lol :) - k06a
Vous devez être quelqu'un parmi mes collègues. - Nakilon


Pour les personnes qui suggèrent d’exécuter des programmes externes pour obtenir le millisecondes ... à ce rythme, vous pourriez aussi bien faire ceci:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

Le point étant: avant de choisir une réponse, gardez à l’esprit que tous les programmes ne fonctionneront pas en une seconde. Mesure!


6
2018-06-23 13:17



Vous ne demandez pas l'heure au système local. Ce qui, je suppose, est impliqué dans la question. Vous dépendez également d'une connexion réseau. - orkoden
@orkoden La question demande explicitement le "nombre de millisecondes depuis l'époque Unix le 1er janvier 1970". En outre, je souligne davantage le fait que vous ne devriez jamais lancer tout le contenu de Ruby ou de Python (ou wget) juste pour avoir le temps - soit que cela se fasse par un canal rapide ou que des millisecondes importent peu. - Camilo Martin
Oui, j'ai compris que vous donniez une solution pire pour mettre en évidence les défauts des mauvaises solutions. J'ai essayé plusieurs solutions et mesuré le temps. lpaste.net/119499 Les résultats sont plutôt intéressants. Même sur une machine i7 très rapide date prend 3 ms pour courir. - orkoden
@orkoden Nice test! Quel OS? Cela pourrait avoir à voir avec les frais généraux de génération de processus. - Camilo Martin
@Nakilon et c’est la raison pour laquelle il ne faut pas s’appuyer sur des commodités faciles à boucler comme celles de la production. - Camilo Martin


cette solution fonctionne sur macOS.

Si vous envisagez d'utiliser un script bash et que vous disposez de python, vous pouvez utiliser ce code:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

3
2018-02-05 14:26



pourquoi le vote bas? - Frank Thonig
Ne semble pas particulièrement justifié. L'indication sur la flèche vers le bas indique "Cette réponse n'est pas utile", mais IMO, c'est utile. Peut-être qu'ils voulaient que vous en fassiez un script Python à la place. Ce serait plus simple et fonctionnerait également comme une commande bash. - Andrew Schulman
Ne vous inquiétez pas trop des votes négatifs (ce n'était pas le mien) ... surtout s'ils sont anonymes (de qui on ne peut pas apprendre ce qui semble être faux, n'est-ce pas?). Juste pour vous aider à le traiter ... voici un autre +1 ... devinez quoi: vous êtes également autorisé à "voter" maintenant, n'est-ce pas? - Pierre.Vriens
Le vote négatif semble avoir été causé par un problème avec le système. Il a depuis été supprimé, à nouveau par le système. - Michael Hampton♦


Si vous recherchez un moyen d'afficher la durée d'exécution de votre script, les éléments suivants fourniront un résultat (pas tout à fait exact):

Au début de votre script, entrez les informations suivantes:

basetime=$(date +%s%N)

Cela vous donnera une valeur de départ de quelque chose comme 1361802943996000000

À la fin de votre script, utilisez ce qui suit

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

qui affichera quelque chose comme

runtime: 12.383 seconds

Remarques:

(1 * 10 ^ 09) peut être remplacé par 1000000000 si vous le souhaitez

"scale=3" est un paramètre plutôt rare qui coercie bc faire ce que tu veux. Il y en a beaucoup plus!

Je n'ai testé cela que sur Win7 / MinGW ... Je n'ai pas de boîte * nix appropriée à portée de main.


2
2018-02-25 14:48



ou vous pouvez simplement utiliser time <script> - warren


Voici comment obtenir le temps en millisecondes sans effectuer de division. Peut-être que c'est plus rapide ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

Mise à jour: Une autre alternative en pure bash qui fonctionne uniquement avec bash 4.2+ est identique à ci-dessus mais utilise printf pour obtenir la date. Ce sera certainement plus rapide car aucun processus n'est dérivé du processus principal.

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

Un autre problème ici est que votre strftime la mise en œuvre devrait soutenir %s et %N ce qui n'est PAS le cas sur ma machine de test. Voir man strftime pour les options prises en charge. Regarde aussi man bashà voir printf syntaxe. -1 et -2 sont des valeurs spéciales pour le temps.


2
2018-02-10 09:05



On dirait que mon strftime(3) ne supporte pas %N donc aucun moyen pour printf imprimer des nanosecondes. J'utilise Ubuntu 14.04. - haridsv
@haridsv, oui, ce n'est pas dans la glibc. date semble être l'option la plus fiable. - akostadinov