2009-12-23 61 views
19

Có cách nào để nhận mili giây và phần thập phân của nó từ năm 1970 bằng ngôn ngữ c không?Làm thế nào tôi có thể nhận được UTCTime trong mili giây kể từ ngày 1 tháng 1 năm 1970 bằng ngôn ngữ c

+0

Bạn không thể lấy phần phân đoạn theo cách độc lập trên nền tảng. Bạn đang tập trung vào nền tảng nào? – dalle

+0

Tôi tuân theo tiêu chuẩn ANSI C, vì vậy ứng dụng của tôi sẽ là nền tảng độc lập. Hiện tại tôi đang ở trên nền tảng cửa sổ. – Siddiqui

Trả lời

32

này hoạt động trên Ubuntu Linux:

struct timeval tv; 

gettimeofday(&tv, NULL); 

unsigned long long millisecondsSinceEpoch = 
    (unsigned long long)(tv.tv_sec) * 1000 + 
    (unsigned long long)(tv.tv_usec)/1000; 

printf("%llu\n", millisecondsSinceEpoch); 

Tại thời điểm viết bài này, printf() trên được đem lại cho tôi 1338850197035. Bạn có thể làm một kiểm tra sự tỉnh táo tại trang web TimestampConvert.com nơi bạn có thể nhập giá trị để lấy lại thời gian tương đương với con người có thể đọc được (mặc dù không có độ chính xác mili giây).

1

Unix time or Posix time là thời gian trong giây từ kỷ nguyên bạn đã đề cập.

bzabhi Câu trả lời là chính xác: bạn chỉ cần nhân dấu thời gian Unix lên 1000 để nhận được mili giây.

Lưu ý rằng tất cả các giá trị mili giây được trả về bằng cách dựa vào dấu thời gian Unix sẽ là bội số của 1000 (như 12345678000). Độ phân giải vẫn chỉ còn 1 giây.

Bạn không thể nhận được phần phần

Các bình luận từ Pavel là đúng cũng có. Dấu thời gian Unix không tính đến giây nhảy vọt. Điều này làm cho nó thậm chí còn ít khôn ngoan hơn để dựa vào một chuyển đổi đến mili giây.

+0

Bất kỳ thư viện nào khác có thể nhận được milisecond chính xác bao gồm cả phần phân số của nó ????? – Siddiqui

+0

Dấu thời gian Unix là về cơ bản như chúng ta có thể đi. Nó phải được rằng các nhà thiết kế của Unix nghĩ rằng một độ phân giải thứ hai là đủ. Sau đó, một lần nữa các chi phí của việc duy trì một độ phân giải 1ms có lẽ ngoài các hệ thống Unix sớm. – pavium

4

Đối với Unix và Linux, bạn có thể sử dụng gettimeofday.

Đối với Win32, bạn có thể sử dụng GetSystemTimeAsFileTime và sau đó convert it to time_t + milliseconds.

+1

gettimeofday() thực hiện những gì cần thiết. Dưới đây là ví dụ về mã: http://www.docs.hp.com/en/B9106-90009/gettimeofday.2.html Vì vậy, những hệ điều hành nào mà Aman đang cố gắng hỗ trợ? – tpgould

6

Nó không phải là tiêu chuẩn C, nhưng gettimeofday() có mặt trong cả hai hệ thống dẫn xuất SysV và BSD và nằm trong POSIX. Nó trả về thời gian kể từ khi kỷ nguyên trong một struct timeval:

struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    suseconds_t tv_usec; /* microseconds */ 
}; 
9

Nếu bạn muốn giải quyết một phần nghìn giây, bạn có thể sử dụng gettimeofday() trong Posix. Để thực hiện Windows, hãy xem gettimeofday function for windows.

#include <sys/time.h> 

... 

struct timeval tp; 
gettimeofday(&tp); 
long int ms = tp.tv_sec * 1000 + tp.tv_usec/1000; 
+3

Nó có thể là 'gettimeofday (& tv, NULL)' – puk

+1

Liên kết trong câu trả lời đã chết. Miền không tồn tại. – owacoder

1
// the system time 
    SYSTEMTIME systemTime; 
    GetSystemTime(&systemTime); 

    // the current file time 
    FILETIME fileTime; 
    SystemTimeToFileTime(&systemTime, &fileTime); 

    // filetime in 100 nanosecond resolution 
    ULONGLONG fileTimeNano100; 
    fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; 

    //to milliseconds and unix windows epoche offset removed 
    ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000; 
    return posixTime; 
Các vấn đề liên quan