Відповіді:
date +%s
поверне кількість секунд з епохи.
date +%s%N
повертає секунди та поточні наносекунди.
date +%s%N | cut -b1-13
дасть вам кількість мілісекунд з епохи - поточні секунди плюс ліві три наносекунди.
і від MikeyB - echo $(($(date +%s%N)/1000000))
(ділення на 1000 приводить до мікросекунд)
echo $(($(date +%s%N)/1000))
Ви можете просто використати %3N
для обрізання наносекунд до трьох найбільш значущих цифр (які потім є мілісекундами):
$ date +%s%3N
1397392146866
Це працює, наприклад, на моєму kubuntu 12.04.
Але майте на увазі, що це %N
може бути не реалізовано залежно від вашої цільової системи. Напр. Тестування на вбудованій системі (rootroot rootfs, складеному за допомогою інструментального ланцюга не-HF arm cross) не було %N
:
$ date +%s%3N
1397392146%3N
(А також у мого (не вкоріненого) Android планшета немає %N
).
1397392146%3N
на 1397392146%N
, але результат - 1397392146%3N
це те, що я насправді бачив на консолі зайнятого планшета Android. Чи можете ви пояснити свою редакцію?
date +%s.%3N
відбитки 1510718281.134
.
date +%N
не працює в OS X, але ви можете використовувати один із
ruby -e 'puts Time.now.to_f'
python -c 'import time; print time.time()'
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
coreutils
Для людей, які пропонують запустити зовнішні програми, щоб отримати мілілі секунди ... з такою швидкістю, ви можете також зробити це:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Справа в тому, що: перш ніж вибирати будь-яку відповідь звідси, майте на увазі, що не всі програми працюватимуть протягом однієї цілої секунди. Міряй!
date
потрібно тривати 3 мс.
це рішення працює на macOS.
якщо ви розглядаєте можливість використання bash-скрипту та наявний python, ви можете використовувати цей код:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Якщо ви шукаєте спосіб відображення тривалості запуску сценарію, наступний результат забезпечить (не зовсім точний) результат:
Наближайтеся до початку сценарію, введіть наступне
basetime=$(date +%s%N)
Це дасть вам початкове значення приблизно на зразок 1361802943996000000
В кінці сценарію використовуйте наступне
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
який відображатиме щось подібне
runtime: 12.383 seconds
Примітки:
(1 * 10 ^ 09) при бажанні можна замінити на 1000000000
"scale=3"
- досить рідкісна установка, яка змушує bc
робити те, що ви хочете. Є ще багато!
Я тестував це лише на Win7 / MinGW ... У мене немає належного * nix-коробки.
time <script>
Ось як отримати час у мілісекундах, не виконуючи ділення. Можливо, це швидше ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
Оновлення: Ще одна альтернатива pure bash, яка працює лише з bash 4.2+
такою ж, як вище, але використовувати printf
для отримання дати. Це, безумовно, буде швидше, оскільки жоден процес не відхиляється від основного.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Ще один прихильність тут полягає в тому, що ваша strftime
реалізація повинна підтримувати, %s
а %N
це НЕ має місце на моїй тестовій машині. Дивіться man strftime
підтримувані варіанти. Також дивіться, man bash
щоб побачити printf
синтаксис. -1
і -2
є особливими значеннями для часу.
strftime(3)
не підтримує, %N
тому немає можливості printf
друкувати наносекунди. Я використовую Ubuntu 14.04.
date
видається більш надійним варіантом.
Найбільш точна мітка часу, яку ми можемо отримати (принаймні для Mac OS X), мабуть, така:
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
Але нам потрібно пам’ятати, що для запуску потрібно близько 30 мілісекунд. Ми можемо вирізати його до шкали дробової частки і на самому початку обчислити середній накладний обсяг часу читання, а потім зняти його з вимірювання. Ось приклад:
function getTimestamp {
echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13`
}
function getDiff {
echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do
#echo -n $i
a=`getTimestamp`
#echo -n " $a"
b=`echo "$a-$prev_a" | bc`
prev_a=$a
#echo " diff=$b"
acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"
Ви можете коментувати команди ехо, щоб побачити, як воно працює.
Результати для цього сценарію зазвичай є одним із цих 3 результатів:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
Використовуючи дату та expr, ви можете потрапити туди, тобто
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
Просто розгорніть його, щоб робити все, що завгодно
Я усвідомлюю, що це не дає мілісекунд з епохи, але це все-таки може бути корисним як відповідь на деякі випадки, все залежить від того, для чого вам це потрібно, помножте на 1000, якщо вам потрібно мілісекундне число: D
Найпростішим способом було б зробити невеликий виконуваний файл (від C f.ex.) і зробити його доступним для сценарію.
date
кілька разів. У деяких випадках дата або час можуть змінюватися між запусками, коли буде написана ваша команда. Краще запустити date
один раз і розібрати деталі і зробити свій розрахунок. Один із кількох способів зробити це було б t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"
. Для цього використовується синтаксис Bash, оскільки питання позначено тегом bash . Як ви натякаєте, ваша відповідь (і моя мінливість) дає лише секунди на поточний день поки що, а не з епохи, а не в мілі.
(повторити зверху) date +%N
не працює в OS X, але ви також можете використовувати:
Perl (потрібен модуль Time :: Format). Мабуть, не найкращий модуль CPAN для використання, але робота виконується. Час :: Формат, як правило, доступний з дистрибутивами.
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
date
його не можна використовувати, і немає команд, що відповідають лише вимогам ".
date
не може використовуватися як частина вашої відповіді , я б видалив свій звуковий запис.
Збирання всіх разом попередніх відповідей, коли в OSX
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
ви можете робити так, як
microtime() {
python -c 'import time; print time.time()'
}
compute() {
local START=$(microtime)
#$1 is command $2 are args
local END=$(microtime)
DIFF=$(echo "$END - $START" | bc)
echo "$1\t$2\t$DIFF"
}
Якщо ви хочете, щоб прості обчислення, оброблені простими оболонками, це легко і портативно, використовуючи вищевказану відповідь:
now() {
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514
Для альпійського Linux (багато зображень докера) та, можливо, інших мінімальних середовищ Linux ви можете зловживати adjtimex
:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimex
використовується для зчитування (і встановлення) змінних часу ядра. З awk
вами можна отримати мікросекунди, з них head
можна використовувати лише перші 3 цифри.
Я поняття не маю, наскільки надійна ця команда.
Примітка: Безсоромно вкрадено з цієї відповіді