มีคำสั่งเชลล์ใน Linux เพื่อให้ได้เป็นมิลลิวินาทีหรือไม่
date -Ins
มีคำสั่งเชลล์ใน Linux เพื่อให้ได้เป็นมิลลิวินาทีหรือไม่
date -Ins
คำตอบ:
date +%s%N
ส่งคืนจำนวนวินาที + nanoseconds ปัจจุบัน
ดังนั้น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"
ส่งคืนเวลาปัจจุบันด้วย nanoseconds
06:46:41.431857000
date +"%T.%6N"
ส่งคืนเวลาปัจจุบันโดยปัดเศษ nanosecond เป็น 6 หลักแรกซึ่งคือ microseconds
06:47:07.183172
date +"%T.%3N"
ส่งคืนเวลาปัจจุบันโดยปัดเศษ nanosecond เป็น 3 หลักแรกซึ่งเป็นมิลลิวินาที
06:47:42.773
โดยทั่วไปทุกฟิลด์ของdate
รูปแบบของคำสั่งสามารถกำหนดความกว้างของฟิลด์ที่เป็นตัวเลือกได้
%xN
: หนึ่งที่ดีสำหรับความกว้างของฟิลด์!
นาโนคือ 10 -9และหนึ่งในพัน 10 -3 ดังนั้นเราสามารถใช้อักขระสามตัวแรกของ nanoseconds เพื่อรับมิลลิวินาที:
date +%s%3N
จากman date
:
% N นาโนวินาที (000000000..999999999)
% s วินาทีตั้งแต่ 1970-01-01 00:00:00 UTC
ที่มา: ข้อผิดพลาดเซิร์ฟเวอร์ฉันจะรับเวลา Unix ปัจจุบันเป็นมิลลิวินาทีเป็น Bash ได้อย่างไร .
นี่คือแฮ็กแบบพกพาสำหรับ 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
นี่เป็นการดำเนินการที่ราคาถูกมากซึ่งทำงานกับ shell internals และ procfs
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
คุณแปลล่ามภาษาไพ ธ อนให้มันโหลดไลบรารี่ของคุณ / เตรียมข้อมูลเบื้องต้นเขียนผลลัพธ์และออกผลลัพธ์นั้นจะไม่ถูกต้องอีกต่อไป
คำตอบอื่น ๆ น่าจะเพียงพอในกรณีส่วนใหญ่ แต่ฉันคิดว่าฉันเพิ่มสองเซ็นต์ของฉันเนื่องจากฉันพบปัญหาในระบบBusyBox
ระบบที่เป็นปัญหาไม่รองรับ%N
ตัวเลือกการจัดรูปแบบและไม่มีตัวแปล Python หรือ Perl
หลังจากเกาหัวไปมากเรา (ขอบคุณเดฟ!) ขึ้นมาด้วยสิ่งนี้:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
มันแยกวินาทีและไมโครวินาทีจากเอาท์พุทของadjtimex
(ปกติใช้เพื่อตั้งค่าตัวเลือกสำหรับนาฬิการะบบ) และพิมพ์โดยไม่มีบรรทัดใหม่ โปรดทราบว่าฟิลด์ microseconds จะต้องมีการเติมล่วงหน้าด้วยศูนย์ แต่สิ่งนี้จะไม่ส่งผลต่อฟิลด์วินาทีซึ่งยาวกว่าหกหลัก จากนี้คุณควรแปลงไมโครวินาทีเป็นมิลลิวินาที
หากคุณต้องการบรรทัดใหม่ที่ตามมา (อาจเป็นเพราะมันดูดีกว่า) ลองทำดู
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
ฉันแค่อยากจะเพิ่มคำตอบของ Alperสิ่งที่ฉันต้องทำเพื่อให้สิ่งนี้ทำงาน:
บน 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-01TT: 00: 00 ในความแม่นยำระดับรอง
the_time = gettimeofday()
ส่งคืนเวลาเป็นวินาทีที่ผ่านไปตั้งแต่ 1970-01-01 UTC เป็นค่าทศนิยม หากเวลาที่ไม่สามารถใช้งานบนแพลตฟอร์มนี้ผลตอบแทนและการตั้งค่า-1
เวลาที่ส่งคืนควรมีความแม่นยำรองวินาทีแต่ความแม่นยำจริงอาจแตกต่างกันไปตามแพลตฟอร์ม หากการเรียกระบบC มาตรฐานพร้อมใช้งานบนแพลตฟอร์มนี้ก็จะส่งกลับค่า มิฉะนั้นถ้าบน MS-Windows ก็พยายามที่จะใช้ERRNO
gettimeofday()
GetSystemTimeAsFileTime()
แหล่งที่มา: คู่มือ GNU awk
บนระบบ Linux ฟังก์ชัน C มาตรฐานgetimeofday()
จะคืนค่าเวลาด้วยความแม่นยำระดับไมโครวินาที
เพื่อแสดงวันที่ด้วยเวลาและเขตเวลา
วันที่ + "% d-% m-% Y% T. % N% Z"
เอาท์พุท: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
จะให้นาโนวินาทีคุณทำงานกับมันได้ไหม