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

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

185 голосов | спросил Richard 14 J0000006Europe/Moscow 2010, 20:04:17

14 ответов


222

Это:

date +% s

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

Это:

date +% s% N

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

Итак:

date +% s% N | разрезать -b1-13

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


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

ответил warren 14 J0000006Europe/Moscow 2010, 20:10:30
77

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

$ date +% s% 3N
1397392146866

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

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

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

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

ответил Joe 13 PMpSun, 13 Apr 2014 16:34:26 +040034Sunday 2014, 16:34:26
49

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

  • ruby: ruby ​​-e 'помещает Time.now.to_f'
  • python: python -c 'время импорта; 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?\\\\\\
  • или для миллисекунд, округленных до ближайшей секунды date +% s000
ответил user495470 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 02 Sep 2012 15:16:07 +0400 2012, 15:16:07
8

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

echo $ (($ (date +% s% N) /1000000))
ответил 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 08 Sep 2010 01:22:11 +0400 2010, 01:22:11
6

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

date +% s000

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

ответил Pablo 10 Mayam12 2012, 00:11:38
6

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

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

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

ответил Camilo Martin 23 J0000006Europe/Moscow 2014, 17:17:25
3

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

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

#! /Bin /Баш

python -c 'от времени импорта времени; print int (round (time () * 1000)) '
ответил Frank Thonig 5 FebruaryEurope/MoscowbMon, 05 Feb 2018 17:26:41 +0300000000pmMon, 05 Feb 2018 17:26:41 +030018 2018, 17:26:41
2

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

Как можно ближе к началу вашего скрипта введите

basetime = $ (date +% s% N)

Это даст вам начальное значение чего-то вроде 1361802943996000000

В конце вашего скрипта используйте следующие

echo "runtime: $ (echo" scale = 3; ($ (date +% s% N) - $ {basetime}) /(1 * 10 ^ 09) "| bc) секунд"

, который отобразит что-то вроде

время выполнения: 12.383 секунды

Примечания:

(1 * 10 ^ 09) можно заменить на 1000000000, если вы пожелаете

"scale = 3" - довольно редкий параметр, который принуждает bc делать то, что вы хотите. Есть еще много!

Я тестировал это только на Win7 /MinGW ... У меня нет подходящего * nix-бокса.

ответил user161733 25 FebruaryEurope/MoscowbMon, 25 Feb 2013 18:48:33 +0400000000pmMon, 25 Feb 2013 18:48:33 +040013 2013, 18:48:33
2

Вот как получить время в миллисекундах без выполнения деления. Возможно, это быстрее ...

# test = `date +% s% N`
# testnum = $ {# test}
# echo $ {test: 0: $ testnum-6}
1297327781715

Обновление. Еще одна альтернатива в чистом bash, которая работает только с bash 4.2 +, такая же, как и выше, но используйте printf, чтобы получить дату. Это определенно будет быстрее, потому что никакие процессы не разветвляются с основного.

printf -v test '% (% s% N) T' -1
testnum = $ {# тест}
echo $ {test: 0: $ testnum-6}

Еще одна уловка заключается в том, что ваша реализация strftime должна поддерживать % s и % N, что НЕ относится к моей тестовой машине. См. man strftime для поддерживаемых параметров. Также см. man bash, чтобы увидеть синтаксис printf. -1 и -2 являются специальными значениями времени.

ответил akostadinov 10 FebruaryEurope/MoscowbThu, 10 Feb 2011 12:05:53 +0300000000pmThu, 10 Feb 2011 12:05:53 +030011 2011, 12:05:53
2

Самая точная метка времени, которую мы можем получить (по крайней мере для Mac OS X), вероятно, такова:

python -c 'import datetime; print datetime.datetime.now (). strftime ("% s.% f") '

+1490665305,021699

Но нам нужно иметь в виду, что для запуска требуется около 30 миллисекунд. Мы можем вырезать его до двухзначной доли и в самом начале вычислить средний накладные расходы для чтения времени, а затем удалить его из измерения. Вот пример:

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now (). strftime ("% s.% f") '| cut -b1-13`
}
функция getDiff {
  echo "$ 2- $ 1- $ MeasuringCost" | До нашей эры
}
prev_a = `getTimestamp`
соотв = 0
Итерации = 30
для i в `seq 1 $ ITERATIONS`, do
  #echo -n $ i
  а = `getTimestamp`
  #echo -n "$ a"
  b = `echo" $ a- $ prev_a "| bc`
  prev_a = $ а
  #echo "diff = $ b"
  acc = `echo" $ acc + $ b "| bc`
сделанный
MeasuringCost = 'echo' scale = 2; $ acc /$ Итерации "| bc`
эхо "среднее: $ MeasuringCost sec"
t1 = `getTimestamp`
сон 2
t2 = `getTimestamp`
эхо "измеренные секунды:` getDiff $ t1 $ t2` "

Вы можете раскомментировать команды эха, чтобы лучше видеть, как это работает.

Результаты для этого скрипта обычно являются одним из трех результатов:

измеренные секунды: 1.99
измеренные секунды: 2,00
измеренные секунды: 2,01
ответил ishahak 28 MaramTue, 28 Mar 2017 05:13:51 +03002017-03-28T05:13:51+03:0005 2017, 05:13:51
1

Использование даты и выражения может привести вас туда т. е.

X = $ (expr \ `date +% H \` \\ * 3600 + \ `date +% M \` \\ * 60 + \ `date +% S \`)
echo $ X

Просто расширьте его, чтобы делать все, что захотите

Я понимаю, что это не дает миллисекунды с эпохи, но все же может быть полезно в качестве ответа для некоторых случаев, все зависит от того, что вам нужно для этого, умножьте на 1000, если вам нужно миллисекундовое число: D

Простейшим способом было бы сделать небольшой исполняемый файл (из C f.ex.) и сделать его доступным для скрипта.

ответил Johan Andersson 25 22014vEurope/Moscow11bEurope/MoscowTue, 25 Nov 2014 18:06:58 +0300 2014, 18:06:58
1

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

Perl (требуется модуль Time :: Format). Возможно, не лучший модуль CPAN для использования, но выполняет свою работу. Время :: Формат обычно предоставляется с дистрибутивами.

perl -w -e'use Time :: Format; printf STDOUT ("% s.% s \ n", время, $ time {"mmm"}) '
ответил TVNshack 15 MarpmTue, 15 Mar 2016 12:52:11 +03002016-03-15T12:52:11+03:0012 2016, 12:52:11
1

Совмещение предыдущих ответов, когда в OSX

ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31 +

вы можете сделать как

microtime () {
    время импорта python -c; print time.time () '
}
вычислить () {
    локальный START = $ (microtime)
    # $ 1 - команда $ 2 - args
    локальный END = $ (microtime)
    DIFF = $ (echo "$ END - $ START" | bc)
    echo "$ 1 \ t $ 2 \ t $ DIFF"
}
ответил loretoparisi 1 PM00000040000004031 2016, 16:42:40
0

Если вы хотите простую вычисление с истекшим временем, это просто и удобно, используя приведенный выше ответ:

now () {
    python -c 'import datetime; print datetime.datetime.now (). strftime ("% s.% f") '
}
seismo: ~ $ x = `now`
seismo: ~ $ y = `now`
seismo: ~ $ echo "$ y - $ x" | До нашей эры
5.212514
ответил Bill Cheswick 26 J0000006Europe/Moscow 2018, 17:15:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132