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

286

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

MOHAMED
источник
12
date +%s.%Nдаст вам наносекунды, вы можете работать с этим?
Wrikken
1
@Wrikken Это не совсем портативный, хотя.
Камило Мартин
16
date + "% Y% m% d.% H% M% S% 3N" - Обычно я использую эту команду, чтобы получить полную дату и уникальное время до миллисекунд для создания временных имен файлов в сценарии Unix Bash. Если ваша система не может справиться с миллисекундами, вы можете перейти к микросекундам или нано секундам, используя от 3 до 6 и 9 соответственно.
Нитин Махеш
Попробуйтеdate -Ins
Dr. Person Person II

Ответы:

344

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

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

Пример:

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

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

Alper
источник
69
не работает в Mac OS, так %Nкак не поддерживаетсяdate
yegor256
33
Вопрос задает команда Linux. Ответ @ alper отлично работает для команды date с GNU coreutils . GNUtize вашего OSX: установите и используйте инструменты командной строки GNU в Mac OS X
caligari
77
date +%s%3Nбыстрее (основываясь на ответе @ michael-defort)
caligari
10
В OSX вам нужно установить версию даты GNU как часть coreutilsиспользования MacPorts или Homebrew - затем используйте gdateкоманду. Смотрите этот вопрос: stackoverflow.com/questions/9804966/…
Pierz
1
Хотя дата +% s% 3N кажется проще или лучше, но использование ее в каком-либо другом вычислении смещения привело к сокращению временной метки на 1 миллисекунду! Но это решение отлично работало с вычислением смещения
Arsinux
342
  • date +"%T.%N" возвращает текущее время с наносекундами.

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

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

    06:47:42.773

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

Майкл Дефорт
источник
32
%xN: хороший для ширины поля!
fduff
1
дата + "% Y% m% d.% H% M% S% 3N" в течение миллисекунд.
Нитин Махеш
4
Я думаю, что это лучший ответ, чем тот, который помечен как правильный.
kcondezo
74

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

date +%s%3N

От man date:

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

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

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

Федорки "ТАК прекратить вредить"
источник
Я так горжусь, что @Peter Mortensen сделал одно из своих превосходных активных чтений на одном из моих постов :) спасибо !!
Федорки "ТАК прекратить вредить"
46

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

brew install coreutils

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

alias date='gdate'

Затем выполните

$ date +%s%N
Джошуа Кук
источник
10

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

Бастиан Битторф
источник
1
До сих пор только один, который работал на Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 ПО ВОСТОЧНОМУ ВРЕМЕНИ) MicroOS - с радостью поддержал бы голос три раза!
Cadoiz
8

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))"'
Тамме Говда
источник
2
... однако, как только вы fork()отключили отдельный процесс, execотредактировали ваш интерпретатор Python, позволили ему загрузить свои библиотеки / инициализировать иначе, записать свой результат и выйти, этот результат больше не будет точным.
Чарльз Даффи
4

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

pghalliday
источник
Вау, отличная альтернатива! Действительно, ваша команда работает, но я понятия не имею, почему. Где я могу найти документацию для команды awk ?! Как, черт возьми, вы узнали, как построить строку для извлечения желаемой информации из вывода adjtimex?
Сатрия
Удивительное решение busybox
Codebling
1

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;
Лоринчи Жигмонд
источник
1

Сценарий Python, как это:

import time
cur_time = int(time.time()*1000)
maoyang
источник
3
это не вернет количество миллисекунд, это вернет количество секунд, выраженное в миллисекундах. Все будет $ SECONDS000
kilianc
1
Код Python @kilianc maoyang предоставляет миллисекунды.
Jlliagre
@jlliagre: Но фактическое разрешение по времени лучше, чем 16-17 мс (1/60 секунды) или нет?
Питер Мортенсен
Да, Python time.time()возвращает число с плавающей запятой с 6 десятичными знаками, по крайней мере, в macOS.
porglezomp
1

Я просто хотел добавить к ответу Альпера, что мне нужно сделать, чтобы этот материал работал:

На 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'
Chet
источник
Мне нравится это решение, но я больше интересуюсь миллис. Я перенес эту функцию на свой .bashrc в Ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv
1

Когда вы используете 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()возвращает время с точностью до микросекунды.

kvantour
источник
0

Показать дату с временем и часовым поясом

дата + "% d-% m-% Y% T.% N% Z"

Выход: 22-04-2020 18: 01: 35.970289239 IST

Анил Агравал
источник