it-roy-ru.com

Команда для получения времени в миллисекундах

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

212
MOHAMED

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

Поэтому echo $(($(date +%s%N)/1000000)) - это то, что вам нужно.

например:

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

date +%s возвращает количество секунд с начала эпохи, если это полезно

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

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

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

    06:47:42.773
    

Как правило, каждому полю формата команды date можно присвоить необязательную ширину поля.

258
Michael Defort

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

date +%s%3N

От man date:

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

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

Источник: Ошибка сервера Как получить текущее время Unix в миллисекундах, используя bash? .

59
fedorqui

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

brew install coreutils

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

alias date='gdate'

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

$ date +%s%N
37
Joshua Cook

Команда date не предоставила миллисекунд в OS X, поэтому использовала псевдоним из python

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

OR

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

Других ответов, вероятно, достаточно в большинстве случаев, но я решил добавить свои 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

Правка:

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

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

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

4
pghalliday

вот как-то переносимый хак для 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

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

2
Bastian Bittorf

Просто хотел добавить к ответу @ 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
Chet

Perl может использоваться для этого даже на экзотических платформах, таких как AIX. Пример:

#!/usr/bin/Perl -w

use strict;
use Time::HiRes qw(gettimeofday);

my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime ($t_sec);

printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
0
Lorinczy Zsigmond

скрипт Python, как это:

import time
cur_time = int(time.time()*1000)
0
maoyang