ฉันจะได้รับเวลา Unix ปัจจุบันเป็นมิลลิวินาที (เช่นจำนวนมิลลิวินาทีตั้งแต่ Unix epoch 1 มกราคม 1970)
ฉันจะได้รับเวลา Unix ปัจจุบันเป็นมิลลิวินาที (เช่นจำนวนมิลลิวินาทีตั้งแต่ Unix epoch 1 มกราคม 1970)
คำตอบ:
date +%s
จะกลับจำนวนวินาทีตั้งแต่ยุค
date +%s%N
ส่งคืนวินาทีและนาโนวินาทีปัจจุบัน
date +%s%N | cut -b1-13
จะให้จำนวนมิลลิวินาทีแก่คุณตั้งแต่วินาที - วินาทีปัจจุบันบวกสามวินาทีที่เหลือ
และจากMikeyB - echo $(($(date +%s%N)/1000000))
(หารด้วย 1,000 นำไปสู่ microseconds เท่านั้น)
echo $(($(date +%s%N)/1000))
คุณสามารถใช้%3N
เพื่อตัดทอน nanoseconds เป็นตัวเลขที่สำคัญที่สุด 3 ตัว (ซึ่งก็คือมิลลิวินาที):
$ date +%s%3N
1397392146866
มันทำงานได้เช่นใน kubuntu 12.04 ของฉัน
แต่ระวังว่า%N
อาจไม่สามารถใช้งานได้ขึ้นอยู่กับระบบเป้าหมายของคุณ เช่นการทดสอบในระบบฝังตัว (build รูท rootfs รวบรวมโดยใช้ toolchain แขนที่ไม่ใช่ HF) ไม่มี%N
:
$ date +%s%3N
1397392146%3N
(และแท็บเล็ต Android ของฉัน (ไม่รูท) ไม่มีเลย%N
)
1397392146%3N
ไป1397392146%N
แต่การส่งออกของ1397392146%3N
นั่นคือสิ่งที่ฉันต้องการเห็นจริงๆบนคอนโซล busybox ของแท็บเล็ต 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
แค่โยนนี่ออกไป แต่ฉันคิดว่าสูตรที่ถูกต้องกับการแบ่งจะเป็น:
echo $(($(date +%s%N)/1000000))
สำหรับผู้ที่แนะนำให้เรียกใช้โปรแกรมภายนอกเพื่อรับมิลลิวินาที ... ในอัตรานั้นคุณอาจทำเช่นนี้:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
จุดคือ: ก่อนที่จะเลือกคำตอบใด ๆ จากที่นี่โปรดทราบว่าไม่ใช่ว่าทุกโปรแกรมจะทำงานภายในหนึ่งวินาที วัด!
date
ก็ใช้เวลา 3 ms ในการทำงาน
วิธีนี้ใช้ได้กับ macOS
หากคุณพิจารณาใช้สคริปต์ทุบตีและมีไพ ธ อนอยู่คุณสามารถใช้รหัสนี้ได้:
#!/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"
เป็นการตั้งค่าที่ค่อนข้างหายากที่ coerces ที่bc
จะทำสิ่งที่คุณต้องการ มีอีกมากมาย!
ฉันทดสอบสิ่งนี้บน Win7 / MinGW เท่านั้น ... ฉันไม่มีกล่อง * * * * ที่ถูกต้อง
time <script>
นี่คือวิธีรับเวลาเป็นมิลลิวินาทีโดยไม่ต้องทำการหาร อาจจะเร็วกว่า ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
อัปเดต: อีกทางเลือกหนึ่งในการทุบตีบริสุทธิ์ที่ใช้ได้เฉพาะกับ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 มิลลิวินาทีในการทำงาน เราสามารถตัดให้เหลือเพียงเสี้ยว 2 หลักและในตอนเริ่มต้นคำนวณค่าใช้จ่ายโดยเฉลี่ยในการอ่านเวลาแล้วลบออกจากการวัด นี่คือตัวอย่าง:
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`"
คุณสามารถยกเลิกการคอมเม้นท์คำสั่ง echo เพื่อดูว่ามันทำงานอย่างไร
ผลลัพธ์สำหรับสคริปต์นี้มักจะเป็นหนึ่งใน 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
เพียงขยายเพื่อทำสิ่งที่คุณต้องการ
ฉันรู้ว่านี่ไม่ได้ให้มิลลิวินาทีตั้งแต่ยุค แต่มันอาจจะมีประโยชน์เป็นคำตอบสำหรับบางกรณีมันทั้งหมดขึ้นอยู่กับสิ่งที่คุณต้องการจริงๆคูณด้วย 1,000 ถ้าคุณต้องการจำนวนมิลลิวินาที: 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"
คือ นี้ใช้ไวยากรณ์ทุบตีตั้งแต่คำถามที่ถูกแท็กทุบตี ในขณะที่คุณพูดถึงคำตอบของคุณ (และรูปแบบของฉัน) ให้เวลาเพียงไม่กี่วินาทีสำหรับวันปัจจุบันจนถึงขณะนี้ไม่ใช่ตั้งแต่ยุคและไม่ใช่มิลลิวินาที
(ทำซ้ำจากด้านบน) date +%N
ไม่ทำงานบน OS X แต่คุณสามารถใช้:
Perl (ต้องใช้เวลา :: รูปแบบโมดูล) อาจไม่ใช่โมดูล CPAN ที่ดีที่สุดที่จะใช้ แต่ทำงานได้สำเร็จ เวลา :: รูปแบบโดยทั่วไปแล้วจะมีให้พร้อมกับการแจกแจง
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
date
ไม่สามารถใช้งานได้และไม่มีคำสั่ง bash-only ที่ตอบสนองความต้องการ
date
ไม่สามารถใช้เป็นส่วนหนึ่งของคำตอบของคุณได้ฉันจะลบ downvote ของฉันออก
รวบรวมคำตอบก่อนหน้านี้ทั้งหมดไว้ด้วยกันเมื่ออยู่ใน 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
สำหรับอัลไพน์ลินุกซ์ (ภาพนักเทียบท่าจำนวนมาก) และสภาพแวดล้อมลินุกซ์ขั้นต่ำอื่น ๆ ที่คุณอาจใช้ในทางที่ผิดadjtimex
:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimex
ถูกใช้เพื่ออ่าน (และตั้งค่า) ตัวแปรเวลาเคอร์เนล ด้วยawk
คุณสามารถรับไมโครวินาทีโดยhead
คุณสามารถใช้ตัวเลข 3 ตัวแรกเท่านั้น
ฉันไม่รู้ว่าคำสั่งนี้เชื่อถือได้แค่ไหน
หมายเหตุ: ถูกขโมยไปอย่างไร้รอยต่อจากคำตอบนี้