Время в миллисекундах с эпохи в терминале

42

Как узнать время с начала эпохи в миллисекундах в терминале OSX?

Эквивалент Linux / Ubuntu date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Который не работает в моем терминале OSX:

OSX $ date +%s.%N
1403377800.N
Адам Матан
источник

Ответы:

48

dateПрограммы в OS X отличается от Coreutils ГНУ dateпрограммы. Вы можете установить coreutils (включая gnu-date), тогда у вас будет версия с dateподдержкой миллисекунд.

Поскольку установка из исходных текстов может быть проблемой для пользователей OS X, я советую вам использовать Homebrew .

Чтобы установить эти инструменты с помощью Homebrew, запустите этот oneliner в своем терминале:

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

Homebrew теперь установлен (после установки рекомендуется следовать рекомендациям установщика). Теперь мы установим coreutils используя brew.

brew install coreutils

Как сказано в установке, все команды были установлены с префиксом «g» (например, gdate, gcat, gln и т. Д.). Если вам действительно нужно использовать эти команды с их обычными именами, вы можете добавить каталог «gnubin» в свой PATH ( ~/.bash_profile), например:

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

Теперь вы можете запустить

gdate +%s.%N

и это выведет ваше время с эпохи в миллисекундах.

CousinCocaine
источник
3
Ницца. Мне даже не пришлось добавлять путь, gdateбыл установлен в /usr/local/bin/gdate.
Адам Матан
Это то, что вы ожидаете. Все двоичные файлы установлены с префиксом g. В пути я указал все те же gnu-coreutils без префикса g. Поэтому, если вы добавите его в свой путь, например, PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", он заменит оригиналы. Таким образом, OS X dateстановится GNU date(вместо gdate)
CousinCocaine
Хорошо, что это сработало.
двоюродный брат Кокаин
3
Технически, +%s.%Nформат дает секунды с точностью до наносекунды, а не миллисекунды. После того, как я использовал brew для установки gdate, я проверил страницу руководства, чтобы узнать, доступны ли миллисекунды. Это не. Также не сказано, что %Nможно указать точность for , но я все равно попробовал. Я обнаружил, что команда для получения секунд с точностью до миллисекунды (то есть, три знака после запятой) есть gdate +%s.%3N.
LS
10

В OS X просто запуск, так date +%sкак OS X не поддерживает больше точности, чем это в dateвыходных данных, и любая избыточная точность, не поддерживаемая внутренним представлением, усекается до минус бесконечности.

Если вы хотите вывод в миллисекундах, вы можете использовать следующую команду, хотя вывод просто исправляется добавлением нулей, а не добавлением точности по вышеуказанной причине. Следующее действительно выводит правильные миллисекунды в системах, которые поддерживают необходимую точность.

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

Источник для вышеуказанной команды: Unix.SE - Как получить миллисекунды с эпохи Unix

Если вы просто хотите команду, которая добавляет правильное количество нулей в OS X, вы можете использовать:

date +%s000
Grg
источник
OS X не поддерживает %-N, так что ничего не делает (и может вызвать проблемы, если установлена ​​переменная оболочки $N). Просто используйте date +%s000(или, date +%s.000если вы хотите десятичную точку).
Гордон Дэвиссон
@Gordon Да, я упомянул об этом, но если OP ищет портативное решение, которое успешно работает на системах с такой точностью, то приведенная выше команда работает. Конечно, вы можете просто добавить нули к выводу, но копирование их в другие системы, которые могут поддерживать дополнительную точность, не будет идеальным.
grg
Ах я вижу. Но поскольку dateкоманда OS X просто проходит %-Nчерез as N, это может помешать вычислению. Попробуйте установить N=7000000000000000000, затем попробуйте команду ... На практике это маловероятно, но я чувствую себя безопаснее с чем-то, что не зависит от окружающей среды.
Гордон Дэвиссон
@Gordon Действительно, установка переменной сломала бы ее - я полагаю, что конкретная переменная может быть сброшена непосредственно перед запуском команды, но сброс переменных, как это, - то, что каждый хороший скрипт должен делать перед выполнением команд в любом случае, imo, на всякий случай. Конечно, все это основано на моем предположении, что OP хочет, чтобы сценарий - отредактированный ответ включал буквальное добавление нулей.
grg
2
ОП запросил «время с начала эпохи, в миллисекундах», это ответ о том, как добавить нули в строку. Не то же самое. Хотя объяснил в посте, а не ответ на вопрос.
Кузен Кокаин
6

это решение работает на macOS.

если вы планируете использовать bash-скрипт и имеете Python, вы можете использовать этот код:

#!/bin/bash

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

Или напишите pythonскрипт напрямую:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Фрэнк Тониг
источник
4

Perl вездесущ.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
источник