Чи є команда оболонки в 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"
повертає поточний час з наносекундами, округленими до перших трьох цифр, що становить мілісекунд.
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
Це дуже дешева операція, яка працює з внутрішніми оболонками і процесами оболонки.
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% Т.% N% Z"
Вихід: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
дали б вам наносекунд, чи можете ви з цим працювати?