Есть ли в Linux команда оболочки для получения времени в миллисекундах?
date -Ins
Есть ли в Linux команда оболочки для получения времени в миллисекундах?
date -Ins
Ответы:
date +%s%N
возвращает количество секунд + текущие наносекунды.
Поэтому echo $(($(date +%s%N)/1000000))
это то , что вам нужно.
Пример:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
возвращает количество секунд с начала эпохи, если это полезно.
%N
как не поддерживаетсяdate
date +%s%3N
быстрее (основываясь на ответе @ michael-defort)
coreutils
использования MacPorts или Homebrew - затем используйте gdate
команду. Смотрите этот вопрос: stackoverflow.com/questions/9804966/…
date +"%T.%N"
возвращает текущее время с наносекундами.
06:46:41.431857000
date +"%T.%6N"
возвращает текущее время с наносекундами, округленными до первых 6 цифр, то есть микросекунд.
06:47:07.183172
date +"%T.%3N"
возвращает текущее время с округленными наносекундами до первых 3 цифр, что составляет миллисекунды.
06:47:42.773
Как правило, каждому полю date
формата команды может быть присвоена необязательная ширина поля.
%xN
: хороший для ширины поля!
Нано составляет 10-9, а милли 10-3 . Следовательно, мы можем использовать три первых символа наносекунд, чтобы получить миллисекунды:
date +%s%3N
От man date
:
% N наносекунд (000000000..999999999)
% s секунд с 1970-01-01 00:00:00 UTC
Источник: Ошибка сервера. Как узнать текущее время Unix в миллисекундах в Bash? ,
На OS X, где date
не поддерживается %N
флаг, я рекомендую установить coreutils
с помощью Homebrew . Это даст вам доступ к команде под названием, gdate
которая будет вести себя как date
в системах Linux.
brew install coreutils
Для более "родного" опыта вы всегда можете добавить это к своему .bash_aliases
:
alias date='gdate'
Затем выполните
$ date +%s%N
Вот как-то переносимый хак для 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.
date
Команда не предоставила миллисекунд на OS X, поэтому использовала псевдоним из python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
ИЛИ
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
отключили отдельный процесс, exec
отредактировали ваш интерпретатор Python, позволили ему загрузить свои библиотеки / инициализировать иначе, записать свой результат и выйти, этот результат больше не будет точным.
Других ответов, вероятно, достаточно в большинстве случаев, но я решил добавить свои два цента, когда столкнулся с проблемой в системе BusyBox .
Рассматриваемая система не поддерживала параметр %N
формата и не имеет интерпретатора Python или Perl.
После долгих царапин мы (спасибо Дейву!) Придумали следующее:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Он извлекает секунды и микросекунды из вывода adjtimex
(обычно используется для установки параметров системных часов) и печатает их без новых строк (поэтому они склеиваются). Обратите внимание, что поле микросекунд должно быть заполнено нулями, но это не влияет на поле секунд, которое в любом случае длиннее шести цифр. Из этого должно быть тривиально преобразовать микросекунды в миллисекунды.
Если вам нужна новая строка (возможно, потому что она выглядит лучше), попробуйте
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
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;
Сценарий Python, как это:
import time
cur_time = int(time.time()*1000)
time.time()
возвращает число с плавающей запятой с 6 десятичными знаками, по крайней мере, в macOS.
Я просто хотел добавить к ответу Альпера, что мне нужно сделать, чтобы этот материал работал:
На 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'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Когда вы используете GNU AWK начиная с версии 4.1, вы можете загрузить библиотеку времени и выполнить:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Будет напечатано текущее время в секундах с 1970-01-01T00: 00: 00 с точностью до секунды.
the_time = gettimeofday()
Возвращает время в секундах, прошедшее с 1970-01-01 UTC, в виде значения с плавающей запятой. Если время недоступно на этой платформе, вернитесь-1
и установитеERRNO
. Возвращаемое время должно иметь точность менее секунды , но фактическая точность может варьироваться в зависимости от платформы. Если стандартныйgettimeofday()
системный вызов C доступен на этой платформе, он просто возвращает значение. В противном случае, если на MS-Windows, он пытается использоватьGetSystemTimeAsFileTime()
.источник: руководство по GNU awk
В системах Linux стандартная функция C getimeofday()
возвращает время с точностью до микросекунды.
Показать дату с временем и часовым поясом
дата + "% d-% m-% Y% T.% N% Z"
Выход: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
даст вам наносекунды, вы можете работать с этим?