Có một lệnh shell trong Linux để có được thời gian tính bằng mili giây không?
date -Ins
Có một lệnh shell trong Linux để có được thời gian tính bằng mili giây không?
date -Ins
Câu trả lời:
date +%s%N
trả về số giây + nano giây hiện tại.
Do đó, echo $(($(date +%s%N)/1000000))
là những gì bạn cần.
Thí dụ:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
trả về số giây kể từ kỷ nguyên, nếu điều đó hữu ích.
%N
không được hỗ trợ bởidate
date +%s%3N
nhanh hơn (dựa trên câu trả lời của @ michael-defort)
coreutils
việc sử dụng MacPorts hoặc Homebrew - sau đó sử dụng gdate
lệnh. Xem câu hỏi này: stackoverflow.com/questions/9804966/
date +"%T.%N"
trả về thời gian hiện tại với nano giây.
06:46:41.431857000
date +"%T.%6N"
trả về thời gian hiện tại với nano giây được làm tròn thành 6 chữ số đầu tiên, đó là micro giây.
06:47:07.183172
date +"%T.%3N"
trả về thời gian hiện tại với nano giây được làm tròn đến 3 chữ số đầu tiên, là mili giây.
06:47:42.773
Nói chung, mọi trường trong date
định dạng của lệnh có thể được cung cấp độ rộng trường tùy chọn.
%xN
: một cái đẹp cho chiều rộng trường!
Nano là 10 −9 và milli 10 3 . Do đó, chúng ta có thể sử dụng ba ký tự đầu tiên của nano giây để có được mili giây:
date +%s%3N
Từ man date
:
% N nano giây (000000000..999999999)
% s giây kể từ 1970-01-01 00:00:00 UTC
Nguồn: Server Fault's Làm thế nào để tôi có được thời gian Unix hiện tại tính bằng mili giây trong Bash? .
Trên OS X, nơi date
không hỗ trợ %N
cờ, tôi khuyên bạn nên cài đặt coreutils
bằng Homebrew . Điều này sẽ cung cấp cho bạn quyền truy cập vào một lệnh được gọi là gdate
sẽ hoạt động như date
trên các hệ thống Linux.
brew install coreutils
Để có trải nghiệm "bản địa" hơn, bạn luôn có thể thêm điều này vào .bash_aliases
:
alias date='gdate'
Sau đó thực hiện
$ date +%s%N
Đây là một bản hack di động nào đó dành cho Linux để có thời gian tính bằng mili giây:
#!/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
Đầu ra là:
3010
Đây là một hoạt động rất rẻ, hoạt động với vỏ và vỏ.
date
lệnh không cung cấp milli giây trên OS X, vì vậy đã sử dụng bí danh từ python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
HOẶC LÀ
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
tắt một quy trình riêng biệt, exec
hãy chỉnh sửa trình thông dịch Python của bạn, để nó tải các thư viện của nó / nếu không thì khởi tạo, viết kết quả của nó và thoát, kết quả đó sẽ không còn chính xác nữa.
Các câu trả lời khác có lẽ là đủ trong hầu hết các trường hợp nhưng tôi nghĩ tôi đã thêm hai xu của mình khi tôi gặp vấn đề trên hệ thống BusyBox .
Hệ thống được đề cập không hỗ trợ %N
tùy chọn định dạng và không có trình thông dịch Python hoặc Perl.
Sau nhiều lần gãi đầu, chúng tôi (cảm ơn Dave!) Đã nghĩ ra điều này:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Nó trích xuất giây và micro giây từ đầu ra của adjtimex
(thường được sử dụng để đặt tùy chọn cho đồng hồ hệ thống) và in chúng mà không có dòng mới (để chúng được dán lại với nhau). Lưu ý rằng trường microseconds phải được đệm trước bằng 0, nhưng điều này không ảnh hưởng đến trường giây dài hơn sáu chữ số. Từ đó, việc chuyển đổi micro giây thành mili giây là chuyện nhỏ.
Nếu bạn cần một dòng mới (có thể vì nó trông tốt hơn) thì hãy thử
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Cũng lưu ý rằng điều này đòi hỏi adjtimex
và awk
phải có sẵn. Nếu không thì với BusyBox, bạn có thể trỏ đến chúng cục bộ bằng:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Và sau đó gọi như trên
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Hoặc tất nhiên bạn có thể đặt chúng vào PATH
BIÊN TẬP:
Ở trên đã làm việc trên thiết bị BusyBox của tôi. Trên Ubuntu tôi đã thử điều tương tự và nhận ra rằng adjtimex
có các phiên bản khác nhau. Trên Ubuntu, nó hoạt động để xuất thời gian tính bằng giây với vị trí thập phân thành micro giây (bao gồm cả một dòng mới)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Tôi sẽ không làm điều này trên Ubuntu. tôi sẽ dùngdate +%s%N
Perl có thể được sử dụng cho việc này, ngay cả trên các nền tảng kỳ lạ như AIX. Thí dụ:
#!/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;
Một tập lệnh Python như thế này:
import time
cur_time = int(time.time()*1000)
time.time()
trả về số float đến 6 chữ số thập phân, ít nhất là trên macOS.
Tôi chỉ muốn thêm vào câu trả lời của Alper những gì tôi phải làm để công cụ này hoạt động:
Trên Mac, bạn sẽ cần brew install coreutils
, vì vậy chúng tôi có thể sử dụng gdate
. Mặt khác, trên Linux, nó chỉ là date
. Và chức năng này sẽ giúp bạn thực hiện các lệnh thời gian mà không phải tạo các tệp tạm thời hoặc bất cứ điều gì:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Và bạn có thể sử dụng nó với một chuỗi:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Khi bạn sử dụng GNU AWK kể từ phiên bản 4.1, bạn có thể tải thư viện thời gian và thực hiện:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Điều này sẽ in thời gian hiện tại tính bằng giây kể từ 1970-01-01T00: 00: 00 với độ chính xác phụ thứ hai.
the_time = gettimeofday()
Trả về thời gian tính bằng giây đã trôi qua kể từ 1970-01-01 UTC dưới dạng giá trị dấu phẩy động. Nếu thời gian không có sẵn trên nền tảng này, hãy quay lại-1
và thiết lậpERRNO
. Thời gian trả về phải có độ chính xác dưới giây , nhưng độ chính xác thực tế có thể thay đổi dựa trên nền tảng. Nếugettimeofday()
cuộc gọi hệ thống C tiêu chuẩn có sẵn trên nền tảng này, thì nó chỉ đơn giản trả về giá trị. Mặt khác, nếu trên MS-Windows, nó sẽ cố gắng sử dụngGetSystemTimeAsFileTime()
.nguồn: hướng dẫn sử dụng GNU awk
Trên các hệ thống Linux, hàm C tiêu chuẩn getimeofday()
trả về thời gian với độ chính xác đến micro giây.
Để hiển thị ngày với thời gian và múi giờ
ngày + "% d-% m-% Y% T.% N% Z"
Đầu ra: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
sẽ cung cấp cho bạn nano giây, bạn có thể làm việc với điều đó?