Cách nhận dấu thời gian hiện tại tính bằng mili giây kể từ năm 1970 giống như cách Java nhận được


134

Trong Java, chúng ta có thể sử dụng System.currentTimeMillis()để lấy dấu thời gian hiện tại tính bằng Milliseconds kể từ thời gian kỷ nguyên đó là -

sự khác biệt, được đo bằng mili giây, giữa thời gian hiện tại và nửa đêm, ngày 1 tháng 1 năm 1970 UTC.

Trong C ++ làm thế nào để có được điều tương tự?

Hiện tại tôi đang sử dụng điều này để có được dấu thời gian hiện tại -

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

Điều này có vẻ đúng hay không?

Câu trả lời:


239

Nếu bạn có quyền truy cập vào thư viện C ++ 11, hãy kiểm tra std::chronothư viện. Bạn có thể sử dụng nó để có được mili giây kể từ Unix Epoch như thế này:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
Đẹp. Thêm số đếm () ở cuối dòng để lấy số mili giây ở định dạng loại cơ bản.
P1r4nh4

1
@lining: Cả hai kỷ nguyên có thể giống nhau, nhưng giá trị của chúng có thể khác nhau. steady_clocksẽ luôn luôn tiến về phía trước, nó là thước đo thực sự của thời gian kể từ thời đại của nó trong khi system_clockcó thể là đại diện cho thời gian logic kể từ thời đại. Cứ sau một giây, cả hai có thể phát triển xa hơn tùy thuộc vào cách triển khai của hệ thống.
Oz.

4
Theo tôi biết, kỷ nguyên cho mỗi đồng hồ phụ thuộc vào việc thực hiện. Công ước dành cho system_clockgiống như thời đại UNIX, nhưng thông số kỹ thuật chỉ nói rằng nó phải là đồng hồ treo tường thời gian thực trên toàn hệ thống. Không có yêu cầu cho steady_clockphù hợp với thực tế, chỉ có điều nó chỉ tiến về phía trước.
Oz.

1
@Jason Bên cạnh gettimeofday không có sẵn trên Windows, thư viện chrono có thể cung cấp cho bạn độ phân giải cao hơn (gtod được giới hạn ở micro giây), cung cấp các đơn vị thời gian theo cách an toàn loại để trình biên dịch có thể thực thi chuyển đổi đơn vị và hoạt động với các toán tử số học thông thường ( thêm timevalstructs là khó chịu).
Oz.

3
Các nhà phát triển Javascript đang cười nhạo tôi khi thấy điều này :(
fantastory

42

sử dụng <sys/time.h>

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

tham khảo điều này .


giải pháp tốt, tôi cũng nghĩ đó nên là gettimeofday (& tp, NULL);
Adem

4
Trước hết, đây là C, không phải C ++. Thứ hai, có những vấn đề với gettimeofday, xem này chẳng hạn.
rustyx

17

Câu trả lời này khá giống với Oz. , Sử dụng <chrono>cho C ++ - Tôi đã không lấy nó từ Oz. Tuy nhiên...

Tôi đã chọn đoạn trích gốc ở cuối trang này và sửa đổi một chút để trở thành một ứng dụng bảng điều khiển hoàn chỉnh. Tôi thích sử dụng thứ lil 'ol' này. Thật tuyệt vời nếu bạn thực hiện nhiều kịch bản và cần một công cụ đáng tin cậy trong Windows để có được kỷ nguyên trong một phần nghìn giây thực tế mà không cần sử dụng VB, hoặc một số mã kém thân thiện, hiện đại hơn.

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

Tôi nhận được một số âm -560549313điều này là không đúng, phải không?
Noitidart

1
@Noitidart Bạn có thể cho tôi biết bạn đang sử dụng nền tảng và trình biên dịch C ++ nào không? Tôi sử dụng thứ này mọi lúc với các công cụ tự động hóa và chưa bao giờ thấy đầu ra âm o.0 Rất vui khi kiểm tra nó. Ngoài ra, đó có phải là một bản sao trực tiếp, hoặc chương trình sửa đổi / tích hợp? Chỉ muốn chắc chắn rằng nó có nguồn gốc từ mã này mà thôi.
kayleeFrye_onDeck

5
Ah @kayleeFrye_onDeck vì tôi đang sử dụng int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. Tôi đã thực hiện điều đó int64_tvà nó hoạt động! Cảm ơn rất nhiều vì đã yêu cầu thêm thông tin để giúp đỡ!
Noitidart

unsigned long longdễ mang theo hơn và __int64chỉ khả dụng trên MSVC.
SS Anne

không có __int64loại trong C ++ tiêu chuẩn. Người ta có thể sử dụng std::int64_tthay thế.
jaskmar

14

Vì C ++ 11, bạn có thể sử dụng std::chrono:

  • có được thời gian hệ thống hiện tại: std::chrono::system_clock::now()
  • có được thời gian kể từ kỷ nguyên: .time_since_epoch()
  • dịch đơn vị cơ bản sang mili giây: duration_cast<milliseconds>(d)
  • dịch std::chrono::millisecondssang số nguyên ( uint64_tđể tránh tràn)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

Tôi đề nghị sử dụng unsigned long longthay vì uint64_t.
csg

13

Nếu sử dụng gettimeofday, bạn phải sử dụng lâu dài nếu không bạn sẽ bị tràn và do đó không phải là số mili giây thực sự kể từ epoch: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; sẽ cung cấp cho bạn một số như 767990892, tròn 8 ngày sau kỷ nguyên ;-).

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

-25

Bao gồm <ctime>và sử dụng timechức năng.


30
Điều này trả về giây kể từ kỷ nguyên. Không phải mili giây.
Progo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.