ฉันจะรับเวลาปัจจุบันบน Linux เป็นมิลลิวินาทีได้อย่างไร
ฉันจะรับเวลาปัจจุบันบน Linux เป็นมิลลิวินาทีได้อย่างไร
คำตอบ:
สามารถทำได้โดยใช้ฟังก์ชันPOSIXclock_gettime
ในรุ่นปัจจุบันของ POSIX, gettimeofday
มีการทำเครื่องหมายที่ล้าสมัย ซึ่งหมายความว่าอาจถูกลบออกจากข้อกำหนดเวอร์ชันในอนาคต นักเขียนแอพลิเคชันได้รับการสนับสนุนที่จะใช้ฟังก์ชั่นแทนclock_gettime
gettimeofday
นี่คือตัวอย่างวิธีใช้clock_gettime
:
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_with_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
ถ้าเป้าหมายของคุณคือการวัดเวลาที่ผ่านไปและระบบของคุณสนับสนุน "เนื่องนาฬิกา" และคุณควรพิจารณาใช้แทนCLOCK_MONOTONIC
CLOCK_REALTIME
gcc
คำสั่งของคุณ
s
เมื่อสิ่งนี้เกิดขึ้น อาจเป็นเหตุการณ์ที่หายาก แต่ตัวเลขส่วนเกินอาจทำให้เกิดปัญหาได้
คุณต้องทำสิ่งนี้:
struct timeval tv;
gettimeofday(&tv, NULL);
double time_in_mill =
(tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond
ต่อไปนี้เป็นฟังก์ชัน util เพื่อรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาที:
#include <sys/time.h>
long long current_timestamp() {
struct timeval te;
gettimeofday(&te, NULL); // get current time
long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
เกี่ยวกับเขตเวลา :
gettimeofday ()รองรับการระบุเขตเวลาฉันใช้NULLซึ่งไม่สนใจเขตเวลา แต่คุณสามารถระบุเขตเวลาได้หากต้องการ
@Update - เขตเวลา
เนื่องจากการlong
แสดงเวลาไม่เกี่ยวข้องหรือมีผลกับเขตเวลาเองดังนั้นจึงtz
ไม่จำเป็นต้องตั้งค่าพารามิเตอร์ gettimeofday () เนื่องจากจะไม่สร้างความแตกต่างใด ๆ
และตามหน้าคนของgettimeofday()
การใช้timezone
โครงสร้างนั้นล้าสมัยดังนั้นtz
โดยปกติแล้วอาร์กิวเมนต์ควรถูกระบุเป็น NULL สำหรับรายละเอียดโปรดตรวจสอบหน้าคน
tz
พารามิเตอร์ของgettimeofday()
as &(struct timezone tz = {480, 0})
จะไม่ได้รับคำเตือนใด ๆ และไม่มีผลใด ๆ กับผลลัพธ์นั่นก็สมเหตุสมผลเนื่องจากการlong
แสดงเวลาไม่เกี่ยวข้องกับหรือได้รับผลกระทบ ตามเขตเวลาเองใช่ไหม?
NULL
ค่าที่เหมาะสมที่จะส่งผ่าน และฉันเชื่อว่าการทดสอบเป็นแนวทางที่ดีในการพิสูจน์สิ่งต่างๆเสมอ
ใช้gettimeofday()
เพื่อรับเวลาเป็นวินาทีและไมโครวินาที การรวมและการปัดเศษเป็นมิลลิวินาทีถือเป็นการออกกำลังกาย
C11 timespec_get
ผลตอบแทนสูงถึงนาโนวินาทีปัดตามความละเอียดของการใช้งาน
มีการใช้งานแล้วใน Ubuntu 15.10 API ลักษณะเช่นเดียวกับ clock_gettime
POSIX
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
รายละเอียดเพิ่มเติมที่นี่: https://stackoverflow.com/a/36095407/895245
มาจากคำตอบ POSIX ของ Dan Moulding สิ่งนี้ควรได้ผล:
#include <time.h>
#include <math.h>
long millis(){
struct timespec _t;
clock_gettime(CLOCK_REALTIME, &_t);
return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6);
}
ตามที่ David Guyon ชี้ให้เห็น: รวบรวมด้วย -lm
เวอร์ชันนี้ไม่จำเป็นต้องมีไลบรารีคณิตศาสตร์และตรวจสอบค่าส่งคืนของ clock_gettime ()
#include <time.h>
#include <stdlib.h>
#include <stdint.h>
/**
* @return milliseconds
*/
uint64_t get_now_time() {
struct timespec spec;
if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
abort();
}
return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}
clock_gettime
) เพิ่มส่วนหัวที่ต้องการและวิธีใดที่จะตอบคำถามของ OP เกี่ยวกับCLOCK_MONOTONIC
ฉันขอแนะนำให้ใช้มาโครมาตรฐานโดยตรงในคำตอบของคุณ (และในรหัสของคุณโดยทั่วไป) แทนการใช้ตัวอักษร