Câu trả lời:
date +%s
sẽ trả về số giây kể từ kỷ nguyên.
date +%s%N
trả về giây và nano giây hiện tại.
date +%s%N | cut -b1-13
sẽ cung cấp cho bạn số mili giây kể từ kỷ nguyên - giây hiện tại cộng với ba phần trăm giây còn lại.
và từ MikeyB - echo $(($(date +%s%N)/1000000))
(chia cho 1000 chỉ mang đến micro giây)
echo $(($(date +%s%N)/1000))
Bạn có thể chỉ cần sử dụng %3N
để cắt các nano giây thành 3 chữ số có ý nghĩa nhất (sau đó là mili giây):
$ date +%s%3N
1397392146866
Điều này hoạt động ví dụ như trên kubfox 12.04 của tôi.
Nhưng hãy lưu ý, điều đó %N
có thể không được thực hiện tùy thuộc vào hệ thống mục tiêu của bạn. Ví dụ, đã thử nghiệm trên một hệ thống nhúng (rootro buildroot, được biên dịch bằng cách sử dụng chuỗi công cụ chéo không phải HF), không có %N
:
$ date +%s%3N
1397392146%3N
(Và cả máy tính bảng Android (không root) của tôi không có %N
).
1397392146%3N
thành 1397392146%N
, nhưng kết quả đầu ra 1397392146%3N
là những gì tôi thực sự thấy trên bảng điều khiển busybox của máy tính bảng Android của tôi. Bạn có thể giải thích chỉnh sửa của bạn?
date +%s.%3N
in 1510718281.134
.
date +%N
không hoạt động trên OS X, nhưng bạn có thể sử dụng một trong
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
Đối với những người đề xuất chạy các chương trình bên ngoài để có được milli giây ... với tốc độ đó, bạn cũng có thể làm điều này:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Quan điểm: trước khi chọn bất kỳ câu trả lời nào từ đây, xin lưu ý rằng không phải tất cả các chương trình sẽ chạy dưới một giây. Đo lường!
date
mất 3 ms để chạy.
giải pháp này hoạt động trên macOS.
nếu bạn cân nhắc sử dụng tập lệnh bash và có sẵn python, bạn có thể sử dụng mã này:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Nếu bạn đang tìm cách hiển thị thời lượng tập lệnh của bạn chạy, phần sau đây sẽ cung cấp kết quả (không hoàn toàn chính xác):
Càng gần đầu tập lệnh của bạn càng tốt, hãy nhập vào phần sau
basetime=$(date +%s%N)
Điều này sẽ cung cấp cho bạn một giá trị bắt đầu của một cái gì đó như 1361802943996000000
Vào cuối tập lệnh của bạn, sử dụng như sau
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
Nó sẽ hiển thị một cái gì đó như
runtime: 12.383 seconds
Ghi chú:
(1 * 10 ^ 09) có thể được thay thế bằng 1000000000 nếu bạn muốn
"scale=3"
là một thiết lập khá hiếm hoi buộc bc
phải làm những gì bạn muốn. Còn nhiều nữa!
Tôi chỉ thử nghiệm điều này trên Win7 / MinGW ... Tôi không có hộp * nix thích hợp trong tay.
time <script>
Đây là cách lấy thời gian tính bằng mili giây mà không cần thực hiện phép chia. Có lẽ nó nhanh hơn ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
Cập nhật: Một cách khác trong bash thuần chỉ hoạt động với bash 4.2+
giống như trên nhưng sử dụng printf
để lấy ngày. Nó chắc chắn sẽ nhanh hơn vì không có quá trình nào được tách ra khỏi quy trình chính.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Một lưu ý khác ở đây là việc strftime
triển khai của bạn phải hỗ trợ %s
và %N
đó không phải là trường hợp trên máy thử nghiệm của tôi. Xem man strftime
cho các tùy chọn được hỗ trợ. Cũng xem man bash
để xem printf
cú pháp. -1
và -2
là những giá trị đặc biệt cho thời gian.
strftime(3)
không hỗ trợ %N
nên không có cách nào printf
để in nano giây. Tôi đang sử dụng Ubuntu 14.04.
date
có vẻ như là lựa chọn đáng tin cậy hơn
Dấu thời gian chính xác nhất mà chúng ta có thể nhận được (ít nhất là đối với Mac OS X) có lẽ là đây:
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
Nhưng chúng ta cần lưu ý rằng phải mất khoảng 30 mili giây để chạy. Chúng ta có thể cắt nó theo tỷ lệ 2 chữ số, và ngay từ đầu, tính toán chi phí trung bình của thời gian đọc, và sau đó loại bỏ nó khỏi phép đo. Đây là một ví dụ:
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`"
Bạn có thể bỏ ghi chú các lệnh echo để thấy rõ hơn cách thức hoạt động của nó.
Kết quả cho kịch bản này thường là một trong 3 kết quả sau:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
Sử dụng ngày và expr có thể giúp bạn có nghĩa là
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
Chỉ cần mở rộng trên đó để làm bất cứ điều gì bạn muốn
Tôi nhận ra rằng điều này không mang lại mili giây kể từ epoch, nhưng nó vẫn có thể hữu ích như một câu trả lời cho một số trường hợp, tất cả phụ thuộc vào những gì bạn cần nó thực sự, nhân với 1000 nếu bạn cần số mili giây: D
Cách đơn giản nhất là tạo một tệp thực thi nhỏ (từ C f.ex.) và làm cho nó có sẵn cho tập lệnh.
date
nhiều lần. Trong một số trường hợp, ngày hoặc giờ có thể thay đổi giữa các lần chạy khi lệnh của bạn được viết. Tốt hơn là chạy date
một lần và phân tích các phần ra và thực hiện tính toán của bạn. Một trong nhiều cách để làm điều đó sẽ là t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"
. Điều này sử dụng cú pháp Bash vì câu hỏi được gắn thẻ bash . Như bạn đã nói, câu trả lời của bạn (và biến thể của tôi) chỉ đưa ra vài giây cho ngày hiện tại cho đến nay và không kể từ Kỷ nguyên và không tính bằng mili.
(lặp lại từ trên) date +%N
không hoạt động trên OS X, nhưng bạn cũng có thể sử dụng:
Perl (yêu cầu mô-đun Time :: Format). Có lẽ không phải là mô-đun CPAN tốt nhất để sử dụng nhưng hoàn thành công việc. Time :: Format thường được cung cấp với các bản phân phối.
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
date
không thể được sử dụng và không có lệnh bash nào chỉ đáp ứng nhu cầu.
date
không thể được sử dụng như một phần câu trả lời của bạn , tôi sẽ xóa phần dưới của tôi.
Đặt tất cả các phản hồi trước đó lại với nhau, khi ở OSX
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
bạn có thể làm như
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"
}
Nếu bạn muốn một vỏ tính toán đơn giản trôi qua, đây là cách dễ dàng và dễ mang theo, sử dụng câu trả lời ở trên:
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
Đối với linux alpine (nhiều hình ảnh docker) và có thể các môi trường linux tối thiểu khác mà bạn có thể lạm dụng adjtimex
:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimex
được sử dụng để đọc (và thiết lập) các biến thời gian của hạt nhân. Với awk
bạn có thể nhận được micro giây, với head
bạn chỉ có thể sử dụng 3 chữ số đầu tiên.
Tôi không biết lệnh này đáng tin cậy như thế nào.
Lưu ý: Bị đánh cắp một cách đáng xấu hổ từ câu trả lời này