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 возвращает количество секунд с начала эпохи, если это полезно.
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формата команды может быть присвоена необязательная ширина поля.
Я так горжусь, что @Peter Mortensen сделал одно из своих превосходных активных чтений на одном из моих постов :) спасибо !!
Федорки "ТАК прекратить вредить"
46
На OS X, где date не поддерживается %Nфлаг, я рекомендую установить coreutilsс помощью Homebrew . Это даст вам доступ к команде под названием, gdateкоторая будет вести себя как dateв системах Linux.
brew install coreutils
Для более "родного" опыта вы всегда можете добавить это к своему .bash_aliases:
До сих пор только один, который работал на Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 ПО ВОСТОЧНОМУ ВРЕМЕНИ) MicroOS - с радостью поддержал бы голос три раза!
Cadoiz
8
date Команда не предоставила миллисекунд на OS X, поэтому использовала псевдоним из python
... однако, как только вы fork()отключили отдельный процесс, execотредактировали ваш интерпретатор Python, позволили ему загрузить свои библиотеки / инициализировать иначе, записать свой результат и выйти, этот результат больше не будет точным.
Чарльз Даффи
4
Других ответов, вероятно, достаточно в большинстве случаев, но я решил добавить свои два цента, когда столкнулся с проблемой в системе BusyBox .
Рассматриваемая система не поддерживала параметр %Nформата и не имеет интерпретатора Python или Perl.
После долгих царапин мы (спасибо Дейву!) Придумали следующее:
Он извлекает секунды и микросекунды из вывода adjtimex (обычно используется для установки параметров системных часов) и печатает их без новых строк (поэтому они склеиваются). Обратите внимание, что поле микросекунд должно быть заполнено нулями, но это не влияет на поле секунд, которое в любом случае длиннее шести цифр. Из этого должно быть тривиально преобразовать микросекунды в миллисекунды.
Если вам нужна новая строка (возможно, потому что она выглядит лучше), попробуйте
Выше сказанное работало на моем устройстве BusyBox. На Ubuntu я попробовал то же самое и понял, что adjtimexимеет разные версии. В Ubuntu это работало для вывода времени в секундах с десятичными разрядами в микросекунды (включая завершающую новую строку)
Вау, отличная альтернатива! Действительно, ваша команда работает, но я понятия не имею, почему. Где я могу найти документацию для команды 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;
это не вернет количество миллисекунд, это вернет количество секунд, выраженное в миллисекундах. Все будет $ 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. И эта функция поможет вам команды времени без необходимости создавать временные файлы или что-либо:
Мне нравится это решение, но я больше интересуюсь миллис. Я перенес эту функцию на свой .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, вы можете загрузить библиотеку времени и выполнить:
Будет напечатано текущее время в секундах с 1970-01-01T00: 00: 00 с точностью до секунды.
the_time = gettimeofday()
Возвращает время в секундах, прошедшее с 1970-01-01 UTC, в виде значения с плавающей запятой. Если время недоступно на этой платформе, вернитесь -1и установите ERRNO. Возвращаемое время должно иметь точность менее секунды , но фактическая точность может варьироваться в зависимости от платформы. Если стандартный gettimeofday()системный вызов C доступен на этой платформе, он просто возвращает значение. В противном случае, если на MS-Windows, он пытается использовать GetSystemTimeAsFileTime().
date +%s.%N
даст вам наносекунды, вы можете работать с этим?date -Ins
Ответы:
date +%s%N
возвращает количество секунд + текущие наносекунды.Поэтому
echo $(($(date +%s%N)/1000000))
это то , что вам нужно.Пример:
date +%s
возвращает количество секунд с начала эпохи, если это полезно.источник
%N
как не поддерживаетсяdate
date +%s%3N
быстрее (основываясь на ответе @ michael-defort)coreutils
использования MacPorts или Homebrew - затем используйтеgdate
команду. Смотрите этот вопрос: stackoverflow.com/questions/9804966/…date +"%T.%N"
возвращает текущее время с наносекундами.date +"%T.%6N"
возвращает текущее время с наносекундами, округленными до первых 6 цифр, то есть микросекунд.date +"%T.%3N"
возвращает текущее время с округленными наносекундами до первых 3 цифр, что составляет миллисекунды.Как правило, каждому полю
date
формата команды может быть присвоена необязательная ширина поля.источник
%xN
: хороший для ширины поля!Нано составляет 10-9, а милли 10-3 . Следовательно, мы можем использовать три первых символа наносекунд, чтобы получить миллисекунды:
От
man date
:Источник: Ошибка сервера. Как узнать текущее время Unix в миллисекундах в Bash? ,
источник
На OS X, где
date
не поддерживается%N
флаг, я рекомендую установитьcoreutils
с помощью Homebrew . Это даст вам доступ к команде под названием,gdate
которая будет вести себя какdate
в системах Linux.Для более "родного" опыта вы всегда можете добавить это к своему
.bash_aliases
:Затем выполните
источник
Вот как-то переносимый хак для Linux для получения времени в миллисекундах:
Выход:
Это очень дешевая операция, которая работает с внутренними оболочками и procfs.
источник
date
Команда не предоставила миллисекунд на OS X, поэтому использовала псевдоним из pythonИЛИ
источник
fork()
отключили отдельный процесс,exec
отредактировали ваш интерпретатор Python, позволили ему загрузить свои библиотеки / инициализировать иначе, записать свой результат и выйти, этот результат больше не будет точным.Других ответов, вероятно, достаточно в большинстве случаев, но я решил добавить свои два цента, когда столкнулся с проблемой в системе BusyBox .
Рассматриваемая система не поддерживала параметр
%N
формата и не имеет интерпретатора Python или Perl.После долгих царапин мы (спасибо Дейву!) Придумали следующее:
Он извлекает секунды и микросекунды из вывода
adjtimex
(обычно используется для установки параметров системных часов) и печатает их без новых строк (поэтому они склеиваются). Обратите внимание, что поле микросекунд должно быть заполнено нулями, но это не влияет на поле секунд, которое в любом случае длиннее шести цифр. Из этого должно быть тривиально преобразовать микросекунды в миллисекунды.Если вам нужна новая строка (возможно, потому что она выглядит лучше), попробуйте
Также обратите внимание, что это требует
adjtimex
иawk
должно быть доступно. Если нет, то с BusyBox вы можете указать на них локально:А затем назвать выше, как
Или, конечно, вы могли бы положить их в свой
PATH
РЕДАКТИРОВАТЬ:
Выше сказанное работало на моем устройстве BusyBox. На Ubuntu я попробовал то же самое и понял, что
adjtimex
имеет разные версии. В Ubuntu это работало для вывода времени в секундах с десятичными разрядами в микросекунды (включая завершающую новую строку)Я бы не стал делать это на Ubuntu. я хотел бы использовать
date +%s%N
источник
Perl может использоваться для этого даже на экзотических платформах, таких как AIX. Пример:
источник
Сценарий Python, как это:
источник
time.time()
возвращает число с плавающей запятой с 6 десятичными знаками, по крайней мере, в macOS.Я просто хотел добавить к ответу Альпера, что мне нужно сделать, чтобы этот материал работал:
На Mac вам понадобится
brew install coreutils
, чтобы мы могли использоватьgdate
. В противном случае на Linux это простоdate
. И эта функция поможет вам команды времени без необходимости создавать временные файлы или что-либо:И вы можете использовать его со строкой:
источник
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Когда вы используете GNU AWK начиная с версии 4.1, вы можете загрузить библиотеку времени и выполнить:
Будет напечатано текущее время в секундах с 1970-01-01T00: 00: 00 с точностью до секунды.
В системах Linux стандартная функция C
getimeofday()
возвращает время с точностью до микросекунды.источник
Показать дату с временем и часовым поясом
Выход: 22-04-2020 18: 01: 35.970289239 IST
источник