Вопрос: Как получить текущее время Unix в миллисекундах с помощью bash?


Как получить текущее время Unix в миллисекундах (т. Е. Число миллисекунд с момента Unix 1 января 1970 г.)?


187
2018-06-14 16:04


Источник




Ответы:


Эта:

date +%s 

вернет число секунд с эпохи.

Эта:

date +%s%N

возвращает секунды и текущие наносекунды.

Так:

date +%s%N | cut -b1-13

даст вам миллисекунды с эпохи - текущие секунды плюс левые три наносекунды.


и из MikeyB - echo $(($(date +%s%N)/1000000)) (деление на 1000 только доходит до микросекунд)


223
2018-06-14 16:10



Интересно, сколько мс кусок добавляет :-) - Kyle Brandt♦
Или если вы хотите сделать все это в оболочке, избегая дорогостоящих издержек дополнительного процесса (фактически, мы избегаем проблемы, когда число цифр в% + s + N изменяется): echo $(($(date +%s%N)/1000)) - MikeyB
Это принцип ... избегайте магических чисел и кода, что вы на самом деле имею в виду, - MikeyB
Я думаю, стоит отметить, что человек попросил Unix, а не Linux, а текущий верхний ответ (date +% s% N) не работает в моей системе AIX. - Pete
@Pete +1 То же самое для OS X и FreeBSD - ocodo


Вы можете просто использовать %3N для усечения наносекунд до 3 наиболее значимых цифр (которые затем составляют миллисекунды):

$ date +%s%3N
1397392146866

Это работает, например. на моем kubuntu 12.04.

Но имейте в виду, что %N не могут быть реализованы в зависимости от вашей целевой системы. Например. тестировался на встроенной системе (buildroot rootfs, скомпилированный с использованием не-HF-крестовины) не было %N:

$ date +%s%3N
1397392146%3N

(А также мой (не привязанный) планшет Android не имеет %N).


77
2018-04-13 12:34



@warren: Я видел, что вы редактировали и 1397392146%3N в 1397392146%N, но выход 1397392146%3N это то, что я действительно видел на консоли busybox моего Android-планшета. Не могли бы вы объяснить свое изменение? - Joe
Комментарий Warren из истории «изменился с 3 на 6, поскольку 3 только довел вас до микросекунд». Его редактирование кажется совершенно ложным; вы должны отбросить его назад. - bukzor
Это особенность GNU coreutils. В конечном итоге это реализовано в гнулибе: github.com/gagern/gnulib/blob/..., - telotortium
вероятно, точка там имеет смысл. date +%s.%3N печать 1510718281.134, - darksky


date +%N не работает на OS X, но вы можете использовать один из

  • Рубин: ruby -e 'puts Time.now.to_f'
  • питон: python -c 'import time; print time.time()'
  • Node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • Интернетов: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • или для миллисекунд, округленных до ближайшей секунды date +%s000

50
2017-09-02 11:16



для полноты ... node -e 'console.log(Date.now())' - slf
Использование PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
Конечно, вам просто нужно подождать, пока эти переводчики разогреваются. Это тоже работает: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
Или, если вы действительно не нужны миллисекунды но только правильный формат: date +%s000 - Lenar Hoyt
@CamiloMartin: Мне нравится ваш (на ухе?) Wget, чтобы получить миллисекундную точность из (удаленного) запроса на веб-сайт ^^. На местном уровне некоторые из приведенных выше примеров действительно, вероятно, ближе к десятой части секунды или, может быть, сотой секунды - Olivier Dulac


Просто выбросив это, я думаю, что правильная формула с разделением будет:

echo $(($(date +%s%N)/1000000))

8
2017-09-07 21:22





Мое решение не лучшее, но работало для меня.

date +%s000

Мне просто нужно было преобразовать дату, например, 2012-05-05 в миллисекунды.


6
2018-05-09 20:11



Удивительный хак, lol :) - k06a
Вы, должно быть, кто-то из моих коллег. - Nakilon


Для людей, которые предлагают запустить внешние программы, чтобы получить Миллисекунд ... с такой скоростью, вы могли бы также сделать это:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

Точка: прежде чем выбирать какой-либо ответ, пожалуйста, имейте в виду, что не все программы будут работать в течение одной секунды. Мера!


6
2018-06-23 13:17



На данный момент вы не спрашиваете местную систему. Я думаю, это подразумевается в вопросе. Вы также зависите от сетевого подключения. - orkoden
@orkoden Вопрос явно задает «количество миллисекунд с момента Unix 1 января 1970 года». Кроме того, я больше указываю, как вы не должны запускать весь Ruby или Python (или wget) только для того, чтобы получить время - либо это делается через быстрый канал, либо миллисекунды не имеют значения. - Camilo Martin
Да, я понял, что вы даете худшее решение, чтобы выделить недостатки «плохих решений». Я попробовал несколько решений и измерил время. lpaste.net/119499 Результаты интересны. Даже на очень быстрой машине i7 date для запуска требуется 3 мс. - orkoden
@orkoden Хорошее тестирование! Какая ОС? Это может быть связано с непроизводительными процессами. - Camilo Martin
@Nakilon, и именно поэтому нельзя полагаться на завитые удобства, подобные тем, что производятся. - Camilo Martin


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

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

#!/bin/bash

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

3
2018-02-05 14:26



почему голос? - Frank Thonig
Не кажется, что это особенно оправдано. Подсказка на стрелке вниз говорит: «Этот ответ не полезен», но ИМО это полезно. Возможно, они хотели, чтобы вы сделали это скриптом Python. Это было бы проще и также отлично работать как команда bash. - Andrew Schulman
Не беспокойтесь слишком много о downvotes (это было не мое) ... особенно если они анонимны (из которых невозможно узнать, что кажется неправильным, верно?). Просто чтобы помочь вам обработать его ... здесь идет еще один +1 ... угадайте, что: ВАМ также разрешено «голосовать» сейчас, верно? - Pierre.Vriens
Похоже, что нисходящая линия была вызвана проблемой с системой. С тех пор он был снова удален системой. - Michael Hampton♦