จะรับเวลาปัจจุบันเป็นมิลลิวินาทีจาก C ใน Linux ได้อย่างไร


89

ฉันจะรับเวลาปัจจุบันบน Linux เป็นมิลลิวินาทีได้อย่างไร

คำตอบ:


102

สามารถทำได้โดยใช้ฟังก์ชันPOSIXclock_gettime

ในรุ่นปัจจุบันของ POSIX, gettimeofdayมีการทำเครื่องหมายที่ล้าสมัย ซึ่งหมายความว่าอาจถูกลบออกจากข้อกำหนดเวอร์ชันในอนาคต นักเขียนแอพลิเคชันได้รับการสนับสนุนที่จะใช้ฟังก์ชั่นแทนclock_gettimegettimeofday

นี่คือตัวอย่างวิธีใช้clock_gettime:

ถ้าเป้าหมายของคุณคือการวัดเวลาที่ผ่านไปและระบบของคุณสนับสนุน "เนื่องนาฬิกา" และคุณควรพิจารณาใช้แทนCLOCK_MONOTONICCLOCK_REALTIME


7
+1 สำหรับการถูกต้อง POSIXly - แต่คำตอบของคุณมีหน่วยผิด สหกรณ์ไม่ต้องการเวลากับมิลลิวินาที แต่เวลาในมิลลิวินาที
pilcrow

5
ทางออกที่ดี แต่อย่าลืม-lmในgccคำสั่งของคุณ
David Guyon

2
ตาม manpage สำหรับรอบคุณต้องการใช้ lround เมื่อกำหนดผลลัพธ์เป็นจำนวนเต็ม (หรือแบบยาว)
hildred

2
คุณต้องใช้ floor () แทน round () เพื่อที่จะไม่ปัดเศษได้ถึง 1,000 ms มิฉะนั้นคุณจะต้องเพิ่มขึ้นsเมื่อสิ่งนี้เกิดขึ้น อาจเป็นเหตุการณ์ที่หายาก แต่ตัวเลขส่วนเกินอาจทำให้เกิดปัญหาได้
Mike

1
@ ไมค์จับใจ. ที่หนึ่งในสองพันไม่ใช่ของหายากดังนั้นควรได้รับการแก้ไขอย่างแน่นอน แทนที่จะใช้พื้นฉันคิดว่าฉันต้องการรักษาความแม่นยำมากกว่านี้เล็กน้อยและยังคงปัดต่อไป แต่ให้เพิ่มตัวนับที่สองหากรอบสูงถึง 1,000
Dan Molding

60

คุณต้องทำสิ่งนี้:


33

ต่อไปนี้เป็นฟังก์ชัน util เพื่อรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาที:

เกี่ยวกับเขตเวลา :

gettimeofday ()รองรับการระบุเขตเวลาฉันใช้NULLซึ่งไม่สนใจเขตเวลา แต่คุณสามารถระบุเขตเวลาได้หากต้องการ


@Update - เขตเวลา

เนื่องจากการlongแสดงเวลาไม่เกี่ยวข้องหรือมีผลกับเขตเวลาเองดังนั้นจึงtzไม่จำเป็นต้องตั้งค่าพารามิเตอร์ gettimeofday () เนื่องจากจะไม่สร้างความแตกต่างใด ๆ

และตามหน้าคนของgettimeofday()การใช้timezoneโครงสร้างนั้นล้าสมัยดังนั้นtzโดยปกติแล้วอาร์กิวเมนต์ควรถูกระบุเป็น NULL สำหรับรายละเอียดโปรดตรวจสอบหน้าคน


1
> gettimeofday () รองรับการระบุเขตเวลาฉันใช้ NULL ซึ่งไม่สนใจเขตเวลา แต่คุณสามารถระบุเขตเวลาได้หากต้องการ คุณผิด. ควรกำหนดเขตเวลาผ่านการโทรไปยัง localtime () เท่านั้น
vitaly.v.ch

@ vitaly.v.ch ฉันทำการทดสอบผ่านtzพารามิเตอร์ของgettimeofday() as &(struct timezone tz = {480, 0})จะไม่ได้รับคำเตือนใด ๆ และไม่มีผลใด ๆ กับผลลัพธ์นั่นก็สมเหตุสมผลเนื่องจากการlongแสดงเวลาไม่เกี่ยวข้องกับหรือได้รับผลกระทบ ตามเขตเวลาเองใช่ไหม?
Trump 2020 - ความยุติธรรมจะมาถึง

ไม่มีเหตุผลที่จะทำการทดสอบใด ๆ เคอร์เนลลินุกซ์ไม่มีข้อมูลที่ถูกต้องเกี่ยวกับเขตเวลาและในเวลาเดียวกันก็ไม่มีวิธีการระบุ เป็นเหตุผลว่าทำไมอาร์กิวเมนต์ tz จึงถูกประมวลผลด้วยวิธีที่เฉพาะเจาะจงมาก การเป็นตัวแทนที่ยาวนานไม่สำคัญ
vitaly.v.ch

@ vitaly.v.ch ณ ช่วงเวลาหนึ่งการแสดงที่ยาวนานไม่แตกต่างกันไปเนื่องจากเขตเวลานั่นเป็นเหตุผลว่าทำไมจึงมีความสำคัญและเนื่องจากปกติแล้วเท่านั้น NULLค่าที่เหมาะสมที่จะส่งผ่าน และฉันเชื่อว่าการทดสอบเป็นแนวทางที่ดีในการพิสูจน์สิ่งต่างๆเสมอ
Trump 2020 - ความยุติธรรมจะมาถึง


7

C11 timespec_get

ผลตอบแทนสูงถึงนาโนวินาทีปัดตามความละเอียดของการใช้งาน

มีการใช้งานแล้วใน Ubuntu 15.10 API ลักษณะเช่นเดียวกับ clock_gettimePOSIX

รายละเอียดเพิ่มเติมที่นี่: https://stackoverflow.com/a/36095407/895245


1

มาจากคำตอบ POSIX ของ Dan Moulding สิ่งนี้ควรได้ผล:

ตามที่ David Guyon ชี้ให้เห็น: รวบรวมด้วย -lm


0

เวอร์ชันนี้ไม่จำเป็นต้องมีไลบรารีคณิตศาสตร์และตรวจสอบค่าส่งคืนของ clock_gettime ()


1
โปรดระบุสิ่งที่คำตอบของคุณนำมาจากคำตอบอื่น ๆ อีก 6 คำตอบ (โดยเฉพาะอย่างยิ่งเนื่องจากคำตอบอื่น ๆ อีก 2 คำตอบอยู่แล้วclock_gettime) เพิ่มส่วนหัวที่ต้องการและวิธีใดที่จะตอบคำถามของ OP เกี่ยวกับCLOCK_MONOTONICฉันขอแนะนำให้ใช้มาโครมาตรฐานโดยตรงในคำตอบของคุณ (และในรหัสของคุณโดยทั่วไป) แทนการใช้ตัวอักษร
PiCTo

1
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
Donald Duck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.