Час в мілісекундах з моменту епохи в терміналі


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яка підтримує мілісекунди.

Оскільки установка з джерела може скласти клопот для рідних користувачів ОС 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

і це видасть ваш час з епохи в мілісекундах.


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

Добре, що це вийшло.
CousinCocaine

3
Технічно +%s.%Nформат дає секунди до наносекундної точності, а не мілісекунд. Після того, як я застосував пивоваріння для встановлення gdate, я перевірив сторінку, щоб побачити, чи є мілісекунди. Це не. Він також не сказав, що точність для цього %Nможна вказати, але я все-таки спробував. Я виявив, що команда звести секунди до точності лише мілісекунди (тобто три десяткових знаки) є 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

OS X не підтримує %-N, тому нічого не робить (і може спричинити проблеми, якщо встановлена ​​змінна оболонки $N). Просто скористайтеся date +%s000(або, date +%s.000якщо ви хочете, десятковою комою).
Гордон Девіссон

@ Gordon Так, я згадував про це, але якщо ОП шукає портативне рішення, яке успішно працює в системах, здатних до такої точності, наведена вище команда працює. Звичайно, ви можете просто додати нулі до виводу, але копіювати їх в інші системи, які можуть підтримувати додаткову точність, не було б ідеально.
гр

А, бачу. Але оскільки dateкоманда OS X просто проходить %-Nчерез N, вона може перешкоджати обчисленню. Спробуйте встановити N=7000000000000000000, потім спробуйте команду ... Це малоймовірний випадок на практиці, але я б почувався безпечнішим у тому, що не залежало від оточення.
Гордон Девіссон

@Gordon Дійсно, встановлення змінної призведе до її розбиття - я вважаю, що конкретну змінну можна було б скинути безпосередньо перед запуском команди, але скидання таких змінних - це те, що повинен робити кожен хороший сценарій, перш ніж виконувати команди, imo, про всяк випадок. Звичайно, все це ґрунтується на моєму припущенні, що ОП хоче відредагований сценарієм відповідь, щоб включити буквальне додавання нулів.
гр

2
ОП запитала "час з епохи, в мілісекундах", це відповідь про те, як додати нульові значення до рядка. Не те ж саме. Хоча пояснено у дописі, не є відповіді на запитання.
CousinCocaine

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)) 

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.