Tiempo en milisegundos desde la época en la terminal

42

¿Cómo obtengo el tiempo transcurrido desde la época, en milisegundos, en el terminal OSX?

El equivalente de Linux / Ubuntu es date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Lo que no funciona en mi terminal OSX:

OSX $ date +%s.%N
1403377800.N
Adam Matan
fuente

Respuestas:

48

El dateprograma en OS X es diferente al dateprograma coreutils de GNU . Puede instalar coreutils (incluida gnu-date), luego tendrá una versión dateque admita milisegundos.

Como la instalación desde el origen puede ser una molestia para los usuarios nativos de OS X, le aconsejo que use Homebrew .

Para instalar estas herramientas usando Homebrew, ejecute este oneliner en su terminal:

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

Homebrew ya está instalado (es aconsejable seguir las sugerencias del instalador después de la instalación). Ahora instalaremos coreutils usando brew.

brew install coreutils

Como dice la instalación, todos los comandos se han instalado con el prefijo 'g' (por ejemplo, gdate, gcat, gln, etc., etc.). Si realmente necesita usar estos comandos con sus nombres normales, puede agregar un directorio "gnubin" a su PATH ( ~/.bash_profile) como:

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

Ahora puedes correr

gdate +%s.%N

y esto generará su tiempo desde la época en milisegundos.

PrimoCocaína
fuente
3
Agradable. Ni siquiera tuve que agregar la ruta, gdateestaba instalado en /usr/local/bin/gdate.
Adam Matan
Eso es lo que esperarías. Todos los binarios se instalan con el prefijo g. En la ruta, proporcioné los mismos gnu-coreutils sin el prefijo g. Entonces, si lo agrega en su ruta como PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", reemplazará a los originales. Entonces OS X se dateconvierte en GNU date(en lugar de gdate)
CousinCocaine
Bien que funcionó.
CousinCocaine
3
Técnicamente, el +%s.%Nformato da los segundos a una precisión de nanosegundos, no milisegundos. Después de usar brew para instalar gdate, revisé la página de manual para ver si milisegundos estaba disponible. No es. Tampoco decía que se %Npudiera especificar una precisión para , pero lo intenté de todos modos. Descubrí que el comando para reducir los segundos a una precisión de milisegundos solamente (es decir, tres decimales) es gdate +%s.%3N.
LS
10

En OS X, simplemente ejecute date +%sya que OS X no admite más precisión que esta en datela salida y cualquier exceso de precisión no admitido por la representación interna se trunca hacia menos infinito.

Si desea una salida de milisegundos, puede usar el siguiente comando, aunque la salida solo se corrige agregando ceros en lugar de agregar precisión debido a la razón antes mencionada. Lo siguiente genera milisegundos correctos en sistemas que admiten la precisión necesaria.

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

Fuente del comando anterior: Unix.SE - Cómo obtener milisegundos desde la época de Unix

Si solo desea un comando que agregue la cantidad correcta de ceros en OS X, puede usar:

date +%s000
grg
fuente
OS X no es compatible %-N, por lo que no hace nada (y podría causar problemas si se establece la variable de shell $N). Solo usa date +%s000(o date +%s.000si quieres el punto decimal).
Gordon Davisson
@ Gordon Sí, mencioné esto, pero si OP está buscando una solución portátil que funcione con éxito en sistemas que sean capaces de esa precisión, el comando anterior funciona. Por supuesto, podría simplemente agregar ceros a la salida, pero copiarlo a otros sistemas que admitan la precisión adicional no sería lo ideal.
grg
Ah, ya veo. Pero dado que el datecomando de OS X simplemente pasa %-Ncomo N, puede interferir con el cálculo. Intente configurar N=7000000000000000000, luego intente el comando ... Este es un caso poco probable en la práctica, pero me sentiría más seguro con algo que no dependiera del entorno.
Gordon Davisson
@Gordon De hecho, establecer la variable la rompería. Supongo que la variable específica podría restablecerse justo antes de ejecutar el comando, pero restablecer variables como esa es algo que todo buen script debería hacer antes de ejecutar comandos de todos modos, por si acaso. Por supuesto, todo esto se basa en mi suposición de que el OP quiere una respuesta editada por script para incluir la adición literal de ceros.
grg
2
El OP solicitó "tiempo desde la época, en milisegundos", esta es una respuesta sobre cómo agregar ceros a una cadena. No es el mísmo. Aunque se explica en la publicación, no es una respuesta a la pregunta.
CousinCocaine
6

Esta solución funciona en macOS.

Si considera usar un script bash y tiene Python disponible, puede usar este código:

#!/bin/bash

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

O escriba un pythonguión directamente:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Frank Thonig
fuente
4

Perl es omnipresente.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
fuente