¿Cómo obtengo el tiempo desde la época, en milisegundos, en la terminal OSX?
El equivalente de Linux/Ubuntu es date +%s.%N
:
Linux $ date +%s.%N
1403377762.035521859
Que no funciona en mi terminal OSX:
OSX $ date +%s.%N
1403377800.N
El date
programa en OS X es diferente al date
programa coreutils de GNU. Puede instalar coreutils (incluido gnu-date), luego tendrá una versión date
que admite milisegundos.
Como la instalación desde la fuente 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 ahora 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 RUTA ( ~/.bash_profile
) como:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
Ahora puedes ejecutar
gdate +%s.%N
y esto generará su tiempo desde la época en milisegundos.
En OS X, simplemente ejecute date +%s
ya que OS X no admite más precisión que esta en date
la salida de y cualquier exceso de precisión no admitido por la representación interna se trunca hacia menos infinito.
Si desea una salida en 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 mencionada anteriormente. Lo siguiente genera milisegundos correctos en sistemas que admiten la precisión necesaria.
echo $(($(date +'%s * 1000 + %-N / 1000000')))
Fuente para el 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
%-N
, por lo que no hace nada (y podría causar problemas si $N
se establece la variable de shell). Solo usa date +%s000
(o date +%s.000
si quieres el punto decimal).date
Pero dado que el comando de OS X solo pasa %-N
como N
, puede interferir con el cálculo. Intente configurar N=7000000000000000000
, luego pruebe 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.date
funciona bien en su máquina, pero es inútil frente a las secuencias de comandos portátiles. Para la portabilidad, esto proporciona el valor más cercano posible.gdate
, no entra en conflicto con la date
herramienta existente. Un script portátil que necesita tiempos de milisegundos podría probar su presencia gdate
y usarlo. date
Si fuera necesario, recurriría a utilizar el +%s.000
formato. Un script muy portátil probaría la salida date
y verificaría que contiene la información necesaria, lo que le permitiría ejecutarse en varios sistemas operativos.Perl es omnipresente.
$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
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 escribe un python
guión directamente:
#!/usr/bin/python
from time import time
print int(round(time() * 1000))
print()
función en lugar de la print
declaración, funcionará con ambas versiones: python -c 'from time import time; print(int(round(time() * 1000)))'
esto le permite usar el python
comando común sin tener que preocuparse de si se resolverá en una ruta para la versión 2 o la versión 3 de Python.
Adán Matan
gdate
se instaló en/usr/local/bin/gdate
.PrimoCocaína
date
se convierte en GNUdate
(en lugar de gdate)PrimoCocaína
Sr. Lance E Sloan
+%s.%N
formato da los segundos con precisión de nanosegundos, no milisegundos. Después de usar brew para instalargdate
, revisé la página de manual para ver si había milisegundos disponibles. No es. Tampoco decía que%N
se podía especificar una precisión para, pero lo intenté de todos modos. Encontré que el comando para obtener los segundos con precisión de milisegundos solamente (es decir, tres lugares decimales) esgdate +%s.%3N
.