2010-09-20 78 views

Trả lời

13

Sử dụng gettimeofday() để nhận thời gian tính bằng giây và micro giây. Kết hợp và làm tròn đến mili giây được để lại dưới dạng bài tập.

0

Nếu bạn đang tìm kiếm thứ gì đó để nhập vào dòng lệnh của mình, thì date +%H:%M:%S.%N sẽ cung cấp cho bạn thời gian bằng nano giây.

+5

Không hoàn toàn: câu hỏi được gắn thẻ 'C' và yêu cầu thời gian epoch tính bằng mili giây. – pilcrow

48

Bạn phải làm một cái gì đó như thế này:

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 
22

Tiếp theo là chức năng util để có được dấu thời gian hiện tại trong 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ợ cho SPE cify 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ờ

Kể từ khi long đại diện của thời gian là không liên quan đến hoặc bị ảnh hưởng bởi bản thân múi giờ, vì vậy việc thiết tz param của gettimeofday() là không cần thiết, vì nó đã giành 't làm cho bất kỳ sự khác biệt.

Và, theo người trang của gettimeofday(), việc sử dụng các cấu trúc timezone là lỗi thời, do đó lập luận tz nên bình thường được quy định như NULL, để biết chi tiết xin vui lòng kiểm tra trang người đàn ông.

+0

> gettimeofday() hỗ trợ để xác định múi giờ, tôi sử dụng NULL, bỏ qua múi giờ, nhưng bạn có thể chỉ định một múi giờ, nếu cần. Bạn đã sai. Múi giờ nên được giới thiệu độc quyền qua cuộc gọi đến localtime(). –

+0

@ vitaly.v.ch Tôi đã làm một bài kiểm tra, thông qua 'tz' param của' 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 ' t có bất kỳ ảnh hưởng nào đến kết quả, điều đó có ý nghĩa, vì đại diện của 'long' thời gian không liên quan đến hoặc bị ảnh hưởng bởi múi giờ, phải không? –

+0

Không có lý do để làm bất kỳ thử nghiệm nào. Hạt nhân Linux không có thông tin thích hợp về múi giờ và đồng thời không có cách nào để cung cấp. Đó là lý do tại sao đối số tz được xử lý theo cách rất cụ thể. đại diện lâu dài không quan trọng. –

72

Điều này có thể đạt được bằng chức năng clock_gettime.

Trong phiên bản hiện tại của POSIX, gettimeofdaymarked obsolete. Điều này có nghĩa là nó có thể bị xóa khỏi phiên bản tương lai của đặc tả. Người viết ứng dụng được khuyến khích sử dụng hàm clock_gettime thay vì gettimeofday.

Dưới đâ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ợ "đồng hồ đơn điệu" tùy chọn, sau đó bạn nên xem xét sử dụng CLOCK_MONOTONIC thay vì CLOCK_REALTIME .

+5

+1 cho chính xác POSIXly - nhưng câu trả lời của bạn có đơn vị sai. OP không muốn thời gian _with_ mili giây, nhưng thời gian _in_ mili giây. – pilcrow

+4

Giải pháp tốt nhưng đừng quên _-lm_ trong lệnh 'gcc' của bạn. –

+1

theo manpage cho vòng, bạn muốn sử dụng lround khi gán kết quả cho một số nguyên (hoặc dài) – hildred

5

C11 timespec_get

Nó trả lên đến nano giây, được làm tròn đến việc giải quyết thực hiện.

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 */ 
}; 

Xem thêm chi tiết ở đây: https://stackoverflow.com/a/36095407/895245

Các vấn đề liên quan