Temps en millisecondes depuis l'époque dans le terminal


42

Comment puis-je avoir l'heure depuis l'époque, en millisecondes, dans le terminal OSX?

L'équivalent Linux / Ubuntu est date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Ce qui ne fonctionne pas dans mon terminal OSX:

OSX $ date +%s.%N
1403377800.N

Réponses:


48

Le dateprogramme sous OS X est différent du dateprogramme coreutils de GNU . Vous pouvez installer coreutils (y compris gnu-date), vous aurez alors une version datequi prend en charge les millisecondes.

Comme l’installation à partir des sources peut être compliquée pour les utilisateurs OS X natifs, je vous conseille d’utiliser Homebrew .

Pour installer ces outils à l’aide de Homebrew, exécutez cette oneliner sur votre terminal:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew est maintenant installé (il est sage de suivre les suggestions de l'installateur après l'installation). Nous allons maintenant installer coreutils en utilisant brew.

brew install coreutils

Comme le dit l'installation, toutes les commandes ont été installées avec le préfixe 'g' (par exemple, gdate, gcat, gnn, etc.). Si vous avez vraiment besoin d'utiliser ces commandes avec leurs noms normaux, vous pouvez ajouter un répertoire "gnubin" à votre PATH ( ~/.bash_profile) comme:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Vous pouvez maintenant courir

gdate +%s.%N

et cela produira votre temps depuis l’époque en millisecondes.


3
Agréable. Je n'ai même pas eu à ajouter le chemin, a gdateété installé dans /usr/local/bin/gdate.
Adam Matan

C'est ce que vous attendez. Tous les fichiers binaires sont installés avec le préfixe g. Dans le chemin que j'ai fourni, tous les mêmes gnu-coreutils sont sans le préfixe g. Donc, si vous l'ajoutez dans votre chemin comme PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", il remplacera les originaux. Donc, OS X datedevient GNU date(au lieu de gdate)
CousinCocaine

Bien que cela a fonctionné.
CousinCocaine

3
Techniquement, le +%s.%Nformat donne les secondes avec une précision de l'ordre de la nanoseconde, pas des millisecondes. Après avoir utilisé le brassage pour l’installer gdate, j’ai vérifié la page de manuel pour savoir si le millisecondes était disponible. Ce n'est pas. Il n’a pas non plus précisé qu’une précision %Npouvait être spécifiée, mais j’ai essayé quand même. J'ai trouvé que la commande pour obtenir les secondes avec une précision à la milliseconde seulement (c'est-à-dire trois décimales) est gdate +%s.%3N.
LS

10

Sous OS X, le simple fait de s’exécuter date +%ssous OS X ne prend pas en charge une plus grande précision que datela sortie de ce dernier, et toute précision excédentaire non prise en charge par la représentation interne est tronquée à l’infini.

Si vous souhaitez une sortie en millisecondes, vous pouvez utiliser la commande suivante, bien que la sortie soit simplement corrigée en ajoutant des zéros plutôt qu'en ajoutant de la précision pour les raisons susmentionnées. Ce qui suit génère des millisecondes correctes sur des systèmes prenant en charge la précision nécessaire.

echo $(($(date +'%s * 1000 + %-N / 1000000')))

Source pour la commande ci-dessus: Unix.SE - Comment obtenir des millisecondes depuis l’époque Unix

Si vous voulez juste une commande qui ajoute le bon nombre de zéros dans OS X, vous pouvez utiliser:

date +%s000

OS X ne prend pas en charge %-N, donc cela ne fait rien (et pourrait causer des problèmes si la variable shell $Nest définie). Utilisez simplement date +%s000(ou date +%s.000si vous voulez le point décimal).
Gordon Davisson

@ Gordon Oui, je l'ai mentionné, mais si OP recherche une solution portable qui fonctionne avec succès sur des systèmes capables de cette précision, la commande ci-dessus fonctionne. Bien sûr, vous pouvez simplement ajouter des zéros à la sortie, mais la copier sur d’autres systèmes prenant en charge la précision supplémentaire ne serait pas idéale.
grg

Ah, je vois. Mais comme la datecommande d' OS X ne fait que passer %-Nau fur et à mesure N, elle peut interférer avec le calcul. Essayez de régler N=7000000000000000000, puis essayez la commande ... C'est un cas peu probable en pratique, mais je me sentirais plus en sécurité avec quelque chose qui ne dépendait pas de l'environnement.
Gordon Davisson

@Gordon En effet, définir la variable la briserait - je suppose que la variable spécifique pourrait être réinitialisée juste avant que la commande ne soit exécutée, mais la réinitialisation de variables comme celle-ci est une chose que tout bon script devrait faire avant d'exécuter des commandes quand même, imo, juste au cas où. Bien sûr, tout cela est basé sur l'hypothèse que le PO veut un script - la réponse modifiée doit inclure l'ajout littéral de zéros.
grg

2
L'OP a demandé "le temps depuis l'époque, en millisecondes", c'est une réponse sur la façon d'ajouter des zéros à une chaîne. Pas le même. Bien que expliqué dans le post, pas une réponse à la question.
CousinCocaine

6

cette solution fonctionne sur macOS.

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

#!/bin/bash

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

Ou écrivez un pythonscript directement:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perl est omniprésent.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.