Làm cách nào để tính thời gian hiện tại trên Linux tính bằng mili giây?
Câu trả lời:
Điều này có thể đạt được bằng cách sử dụng chức năng POSIXclock_gettime
.
Trong phiên bản hiện tại của POSIX, gettimeofday
được đánh dấu là lỗi thời . Điều này có nghĩa là nó có thể bị xóa khỏi phiên bản trong tương lai của thông số kỹ thuật. Người viết ứng dụng được khuyến khích sử dụng clock_gettime
chức năng thay vì gettimeofday
.
Đây là một ví dụ về cách sử dụng 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);
}
Nếu mục tiêu của bạn là đo thời gian đã trôi qua và hệ thống của bạn hỗ trợ tùy chọn "đồng hồ đơn âm", thì bạn nên cân nhắc sử dụng CLOCK_MONOTONIC
thay vì CLOCK_REALTIME
.
gcc
lệnh của bạn .
s
khi điều này xảy ra. Có lẽ là một sự kiện hiếm nhưng chữ số thừa có thể gây ra rắc rối.
Sau đây là hàm dùng để lấy dấu thời gian hiện tại tính bằng mili giây:
#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;
}
Về múi giờ :
gettimeofday () hỗ trợ để chỉ định múi giờ, tôi sử dụng NULL , bỏ qua múi giờ, nhưng bạn có thể chỉ định múi giờ, nếu cần.
@Update - múi giờ
Vì việc long
biểu diễn thời gian không liên quan hoặc bị ảnh hưởng bởi chính múi giờ, vì vậy việc đặt tz
tham số của gettimeofday () là không cần thiết, vì nó sẽ không tạo ra bất kỳ sự khác biệt nào.
Và, theo trang mangettimeofday()
, việc sử dụng timezone
cấu trúc đã lỗi thời, do đó tz
đối số thường phải được chỉ định là NULL, để biết chi tiết, vui lòng kiểm tra trang man.
tz
số gettimeofday()
như &(struct timezone tz = {480, 0})
sẽ không nhận được bất kỳ cảnh báo nào và nó không có bất kỳ ảnh hưởng nào đến kết quả, điều đó có ý nghĩa, vì long
biểu diễn thời gian không liên quan hoặc ảnh hưởng đến theo múi giờ, phải không?
NULL
giá trị hợp lý mới được vượt qua. Và, tôi tin rằng thử nghiệm luôn là một cách tiếp cận tốt để chứng minh mọi thứ.
Sử dụng gettimeofday()
để lấy thời gian tính bằng giây và micro giây. Việc kết hợp và làm tròn đến mili giây còn lại như một bài tập.
C11 timespec_get
Nó trả về tối đa nano giây, được làm tròn đến độ phân giải của quá trình triển khai.
Nó đã được triển khai trong Ubuntu 15.10. API trông giống như POSIX clock_gettime
.
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Thêm chi tiết tại đây: https://stackoverflow.com/a/36095407/895245
Bắt nguồn từ câu trả lời POSIX của Dan Moulding, điều này sẽ hoạt động:
#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);
}
Cũng như được chỉ ra bởi David Guyon: biên dịch với -lm