Lệnh lấy thời gian tính bằng mili giây


286

Có một lệnh shell trong Linux để có được thời gian tính bằng mili giây không?


12
date +%s.%Nsẽ cung cấp cho bạn nano giây, bạn có thể làm việc với điều đó?
Wrikken

1
@Wrikken Điều này không hoàn toàn di động.
Camilo Martin

16
ngày + "% Y% m% d.% H% M% S% 3N" - Nói chung tôi sử dụng lệnh này để lấy thời gian duy nhất và duy nhất cho đến mili giây để tạo tên tệp tạm thời trong tập lệnh bash unix. Nếu hệ thống của bạn không thể xử lý được hàng nghìn giây, bạn có thể chuyển sang micro hoặc nano giây bằng cách sử dụng 3 đến 6 và 9 tương ứng.
Nitin Mahesh

Hãy thửdate -Ins
Tiến sĩ Person II II

Câu trả lời:


343

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.


69
không hoạt động trên Mac OS, vì %Nkhông được hỗ trợ bởidate
yegor256

33
Câu hỏi là yêu cầu lệnh Linux. Câu trả lời của @ alper hoạt động tốt đối với lệnh date với GNU coreutils . GNUtize OSX của bạn: Cài đặt và sử dụng các công cụ dòng lệnh GNU trên Mac OS X
caligari

77
date +%s%3Nnhanh hơn (dựa trên câu trả lời của @ michael-defort)
caligari

10
Trên OSX, bạn cần cài đặt phiên bản ngày của GNU như một phần của coreutilsviệc sử dụng MacPorts hoặc Homebrew - sau đó sử dụng gdatelệnh. Xem câu hỏi này: stackoverflow.com/questions/9804966/
Kiếm

1
Mặc dù ngày +% s% 3N có vẻ dễ hơn hoặc tốt hơn, nhưng việc sử dụng nó trong một số tính toán bù khác đã khiến dấu thời gian giảm đi 1 mili giây! Nhưng giải pháp này hoạt động hoàn hảo với tính toán bù
Arsinux

341
  • 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.


32
%xN: một cái đẹp cho chiều rộng trường!
fduff

1
ngày + "% Y% m% d.% H% M% S% 3N" trong mili giây.
Nitin Mahesh

4
Tôi đoán đây là một câu trả lời tốt hơn rằng câu trả lời đúng.
kcondezo

74

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? .


Tôi cảm thấy rất tự hào khi @Peter Mortensen đã thực hiện một trong những bài đọc tích cực tuyệt vời của anh ấy trên một trong những bài viết của tôi :) cảm ơn !!
fedorqui 'SO ngừng làm hại'

46

Trên OS X, nơi datekhông hỗ trợ %Ncờ, tôi khuyên bạn nên cài đặt coreutilsbằ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à gdatesẽ hoạt động như datetrê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

10

Đâ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ỏ.


1
Chỉ có một cho đến nay hoạt động trên Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - sẽ sẵn sàng nâng cấp ba lần!
Cadoiz

8

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))"'

2
... tuy nhiên, khi bạn đã fork()tắt một quy trình riêng biệt, exechã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.
Charles Duffy

4

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ợ %Ntù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 adjtimexawkphả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 adjtimexcó 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


Wow, sự thay thế tuyệt vời! Thật vậy, lệnh của bạn hoạt động, nhưng tôi không biết tại sao. Tôi tìm tài liệu cho lệnh awk ở đâu?! Làm thế nào trong địa ngục bạn đã tìm ra cách xây dựng chuỗi để trích xuất thông tin mong muốn ra khỏi đầu ra của adjtimex?
Satria

Giải pháp busybox tuyệt vời
Codebling

1

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;

1

Một tập lệnh Python như thế này:

import time
cur_time = int(time.time()*1000)

3
điều này sẽ không trả về số mili giây, điều này sẽ trả về số giây được biểu thị bằng mili giây. Mọi thứ sẽ là $ SECONDS000
kilianc

1
Mã Python của @kilianc maoyang đang cung cấp mili giây.
jlliagre

@jlliagre: Nhưng độ phân giải thời gian thực tế có tốt hơn 16-17 ms (1/60 giây) hay không?
Peter Mortensen

Có, Python time.time()trả về số float đến 6 chữ số thập phân, ít nhất là trên macOS.
porglezomp

1

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'

Tôi thích giải pháp này nhưng tôi quan tâm nhiều hơn đến millis. Tôi đã chuyển chức năng này sang .bashrc của mình trong function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
ubfox

1

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 -1và thiết lập ERRNO. 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ếu gettimeofday()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ụng GetSystemTimeAsFileTime().

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.


0

Để 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.