2013-05-14 2 views
159

Есть ли команда оболочки в Linux, чтобы получить время в миллисекундах?Команда Linux для получения времени в миллисекундах

+8

'date +% s.% N' даст вам наносекунды, вы можете работать с этим? – Wrikken

+1

@Wrikken Это не совсем портативно. –

+8

date + "% Y% m% d.% H% M% S% 3N" - Обычно я использую эту команду для получения фульплата и уникального времени до миллисекунды для создания временных имен файлов в сценарии unix bash. Если ваша система не в состоянии справиться с миллисекундами, вы можете перейти на микро- или nano-секунды, используя 3-6 и 9 соответственно. –

ответ

215

date +%s возвращает количество секунд с момента создания.

date +%s%N возвращает количество секунд + текущие наносекунды.

Поэтому echo $(($(date +%s%N)/1000000)) является то, что вам нужно

+40

не работает в Mac OS, так как '% N' не поддерживается' date' – yegor256

+25

Вопрос запрашивает команду Linux. Ответ @ alper отлично подходит для команды date с [GNU coreutils] (http://www.gnu.org/software/coreutils/). GNUtize вашего OSX: [Установить и использовать инструменты командной строки GNU в Mac OS X] (http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- in-mac-os-x /) – caligari

+53

'date +% s% 3N' быстрее (на основе ответа @ michael-defort) – caligari

195
  • date +"%T.%N" возвращает текущее время с наносекунд.

  • date +"%T.%6N" возвращает текущее время с наносекундами, округленными до первых 6 цифр, что составляет микросекунды.

  • date +"%T.%3N" возвращает текущее время с наносекундами, округленными до первых трех цифр, что составляет миллисекунды.

В общем, каждое поле формата date командования может быть предоставлена ​​опция ширины поля.

+16

'% xN': хороший для ширины поля! – fduff

+0

date + "% Y% m% d.% H% M% S% 3N" в течение миллисекунд. –

0

питон скрипт так:

import time 
cur_time = int(time.time()*1000) 
+2

, это не вернет число миллисекунд, это вернет число секунд, выраженное в миллисекундах. Все будет $ SECONDS000 – kilianc

+0

повторить код python, теперь он работает. – maoyang

+0

@kilianc. Кодекс Python от maoyang предоставляет миллисекунды. – jlliagre

40

нано 10 -9 и милли 10 -3. Следовательно, мы можем использовать первые 3 символа наносекунд, чтобы получить милли:

date +%s%3N 

От man date:

% N наносекунд (000000000..999999999)

% S секунд с 1970-01-01 00:00:00 UTC

Источник: ошибка сервера How do I get current Unix time in milliseconds using bash?.

27

В OS X, где date не поддерживает флаг %N, я рекомендую установить coreutils с помощью homebrew.

brew install coreutils 

Это даст вам доступ к команде под названием gdate, который будет вести себя, как date делает на системах Linux.

Для более «родного» опыта, вы всегда можете добавить это к вашему .bash_aliases

alias date='gdate' 

затем выполнить

$ date +%s%N 
1

других ответов, вероятно, в большинстве случаев достаточно, но я думал, что я d добавьте мои 2 цента, когда я столкнулся с проблемой в системе busybox.

Данная система не поддерживает формат %N и не имеет python или perl переводчика.

После долгих головы царапин мы (спасибо Дэйв!) Придумал это:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' 

Извлекает секунды и микросекунд с выхода adjtimex (обычно используется для установки параметров для системных часов) и печатные издания они без новых линий (поэтому их склеивают). Обратите внимание, что поле микросекунд должно быть предварительно заполнено нулями, но это никак не влияет на поле секунд, которое больше 6 цифр. Из этого следует тривиально преобразовать микросекунды в миллисекунды.

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

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n" 

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

ln -s /bin/busybox ./adjtimex 
ln -s /bin/busybox ./awk 

И затем вызвать выше как

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' 

Или, конечно, вы можете поместить их в PATH

EDIT:

Вышеописанное работает на моем устройстве busybox. На Ubuntu я попробовал то же самое и понял, что adjtimex имеет разные версии. В Ubuntu это работало для вывода времени в секундах с знаками после запятой до микросекунд (в том числе завершающей новой линии)

sudo apt-get install adjtimex 
adjtimex -p | awk '/raw time:/ { print $6 }' 

Я бы не сделать это на Ubuntu, хотя. Я хотел бы использовать date +%s%N

2

date команды вратаря обеспечивают милли секунд на OS X, поэтому используется псевдоним из питона

millis(){ python -c "import time; print(int(time.time()*1000))"; } 

ИЛИ

alias millis='python -c "import time; print(int(time.time()*1000))"' 
0

Просто хотел добавить @ ответ ALPER, что я имел чтобы получить этот материал:

На Mac вам понадобится brew install coreutils, поэтому мы можем использовать gdate. В противном случае на Linux, его просто date.И эта функция поможет вам команды времени без необходимости создания временных файлов или что-нибудь:

function timeit() { 
    start=`gdate +%s%N` 
    bash -c $1 
    end=`gdate +%s%N` 
    runtime=$(((end-start)/1000000000.0)) 
    echo " seconds" 
} 

И вы можете использовать его со строкой timeit 'tsc --noEmit'

0

вот как-то портативный хак для Linux для получения времени в миллисекундах :

#!/bin/sh 
read up rest </proc/uptime; t1="${up%.*}${up#*.}" 
sleep 3 # your command 
read up rest </proc/uptime; t2="${up%.*}${up#*.}" 

millisec=$((10*(t2-t1))) 
echo $millisec 

выход:

3010 

Это очень дешевая операция, которая работает с внутренними оболочками и procfs