ฉันจะได้รับเวลาตั้งแต่กาลเป็นมิลลิวินาทีใน terminal OSX ได้อย่างไร
Linux / Ubuntu ที่เทียบเท่าคือdate +%s.%N
:
Linux $ date +%s.%N
1403377762.035521859
ซึ่งไม่ทำงานใน terminal OSX ของฉัน:
OSX $ date +%s.%N
1403377800.N
ฉันจะได้รับเวลาตั้งแต่กาลเป็นมิลลิวินาทีใน terminal OSX ได้อย่างไร
Linux / Ubuntu ที่เทียบเท่าคือdate +%s.%N
:
Linux $ date +%s.%N
1403377762.035521859
ซึ่งไม่ทำงานใน terminal OSX ของฉัน:
OSX $ date +%s.%N
1403377800.N
คำตอบ:
date
โปรแกรมใน OS X เป็นที่แตกต่างกว่า coreutils GNU ของdate
โปรแกรม คุณสามารถติดตั้ง coreutils (รวมถึง gnu-date) จากนั้นคุณจะมีเวอร์ชันdate
ที่รองรับมิลลิวินาที
การติดตั้งจากแหล่งที่สามารถรบกวนสำหรับผู้ใช้ OS X พื้นเมืองของผมแนะนำให้คุณใช้Homebrew
ในการติดตั้งเครื่องมือเหล่านี้โดยใช้Homebrew ให้รัน oneliner นี้ในเทอร์มินัลของคุณ:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
ขณะนี้ Homebrew ได้รับการติดตั้งแล้ว (ควรทำตามคำแนะนำของผู้ติดตั้งหลังการติดตั้ง) ตอนนี้เราจะติดตั้ง coreutils brew
ใช้
brew install coreutils
ตามการติดตั้งบอกว่าคำสั่งทั้งหมดได้รับการติดตั้งด้วยคำนำหน้า 'g' (เช่น gdate, gcat, gln, etc ฯลฯ ) หากคุณต้องการใช้คำสั่งเหล่านี้พร้อมชื่อปกติคุณสามารถเพิ่มไดเรกทอรี "gnubin" ลงใน PATH ( ~/.bash_profile
) ของคุณเช่น:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
ตอนนี้คุณสามารถเรียกใช้
gdate +%s.%N
และสิ่งนี้จะเอาท์พุทเวลาของคุณตั้งแต่ยุคในมิลลิวินาที
date
จะกลายเป็น GNU date
(แทน gdate)
+%s.%N
รูปแบบให้วินาทีลงไปที่ความแม่นยำระดับนาโนวินาทีไม่ใช่มิลลิวินาที หลังจากที่ฉันใช้ Brew เพื่อติดตั้งgdate
ฉันตรวจสอบ manpage เพื่อดูว่ามีมิลลิวินาทีหรือไม่ มันไม่ใช่. นอกจากนี้ยังไม่ได้บอกว่า%N
สามารถระบุความแม่นยำได้ แต่ฉันลองต่อไป ฉันพบว่าคำสั่งที่จะได้รับวินาทีลงไปที่ความแม่นยำมิลลิวินาทีเท่านั้น (เช่นสามตำแหน่งทศนิยม) gdate +%s.%3N
เป็น
ใน OS X เพียงแค่รันdate +%s
ในขณะที่ OS X ไม่รองรับความแม่นยำใด ๆ มากกว่านี้ในdate
เอาต์พุตและความแม่นยำเกินที่ไม่สนับสนุนโดยการเป็นตัวแทนภายในจะถูกตัดทอนไปยังลบอนันต์
หากคุณต้องการเอาต์พุตเป็นมิลลิวินาทีคุณสามารถใช้คำสั่งต่อไปนี้แม้ว่าเอาต์พุตจะถูกแก้ไขโดยการผนวกศูนย์แทนการเพิ่มความแม่นยำเนื่องจากเหตุผลดังกล่าวข้างต้น ข้อมูลต่อไปนี้ส่งออกมิลลิวินาทีที่ถูกต้องบนระบบที่รองรับความแม่นยำที่จำเป็น
echo $(($(date +'%s * 1000 + %-N / 1000000')))
แหล่งที่มาสำหรับคำสั่งข้างต้น: Unix.SE - วิธีรับมิลลิวินาทีตั้งแต่ Unix ยุค
หากคุณต้องการคำสั่งที่ต่อท้ายจำนวนศูนย์ใน OS X คุณสามารถใช้:
date +%s000
%-N
ดังนั้นจึงไม่ทำอะไรเลย (และอาจทำให้เกิดปัญหาได้หาก$N
ตั้งค่าตัวแปรเชลล์) เพียงแค่ใช้date +%s000
(หรือdate +%s.000
ถ้าคุณต้องการจุดทศนิยม)
date
คำสั่งของ OS X เพิ่ง%-N
ผ่านเป็นN
มันสามารถรบกวนการคำนวณ ลองตั้งค่าN=7000000000000000000
จากนั้นลองใช้คำสั่ง ... นี่เป็นกรณีที่ไม่น่าเป็นไปได้ในทางปฏิบัติ แต่ฉันรู้สึกปลอดภัยกับบางสิ่งที่ไม่ได้ขึ้นอยู่กับสภาพแวดล้อม
วิธีนี้ใช้ได้กับ macOS
หากคุณพิจารณาใช้สคริปต์ทุบตีและมีไพ ธ อนอยู่คุณสามารถใช้รหัสนี้ได้:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
หรือเขียนpython
สคริปต์โดยตรง:
#!/usr/bin/python
from time import time
print int(round(time() * 1000))
Perl เป็นที่แพร่หลาย
$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
gdate
/usr/local/bin/gdate