2014-12-08 19 views
6

Tôi biết rằng giá trị mặc định của std::chrono::system_clock::time_point là kỷ nguyên của đồng hồ, nhưng tôi không thể tìm thấy bất kỳ nhiệm vụ nào trong tiêu chuẩn C++ 11 mà kỷ nguyên của system_clock giống nhau là kỷ nguyên POSIX (1970-01-01T00: 00: 00Z). Có an toàn để giả định trên Linux và Windows rằng đây là trường hợp? Hay thông minh hơn để sử dụng std::chrono::system_clock::from_time_t(0)?Nhận POSIX epoch là system_clock :: time_point

Trả lời

6

Tiêu chuẩn rời khỏi kỷ nguyên của std::chrono::system_clock::time_point không xác định.

Có ba triển khai của std::chrono::system_clock::time_point tôi biết:

  1. libC++
  2. libstdC++
  3. VS

Cả ba trong số đó là giấy gói mỏng xung quanh Unix Time, mà đếm số lượng số giây đã trôi qua kể từ 00:00:00 Giờ Quốc tế Phối hợp (UTC), Thứ Năm, ngày 1 tháng 1 năm 1970, không tính giây nhảy vọt.

Tất cả chúng đều dựa trên loại tích phân 64 bit đã ký. Không ai trong số họ là ổn định. libC++ có khoảng thời gian đánh dấu là micro giây. libstdC++ có một khoảng thời gian đánh dấu là nano giây, và VS có một khoảng thời gian đánh dấu là 0,1 micro giây.

Trong trường hợp hữu ích, here is a paper minh họa một số công thức để tận dụng lợi thế của thời đại không xác định nhưng phổ biến để chuyển đổi qua lại từ lịch dân sự mà không qua time_t.

Lợi thế của việc sử dụng std::chrono::system_clock::from_time_t là nó được đảm bảo hoạt động theo tiêu chuẩn. Điểm bất lợi là trong thực tế nó sẽ giới hạn bạn đến độ chính xác của một giây (mặc dù độ chính xác đó là không xác định).

Lợi thế của giả sử kỷ nguyên std::chrono::system_clock là 1970-01-01, mặc dù nó không được chỉ định, là bạn sẽ chính xác trên tất cả các triển khai đã biết và độ chính xác có sẵn cho giải pháp thay thế này cao hơn nhiều bởi time_t.

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