2011-02-05 37 views
21

Mức độ tương tác được tăng lên :: date_time và std :: chrono như thế nào? Ví dụ, có cách nào để chuyển đổi giữa tăng :: posix_time :: ptime và std :: chrono :: time_point?Khả năng tương tác giữa tăng :: date_time và std :: chrono

Tôi đã thử tìm kiếm tài liệu về các chuyển đổi như vậy nhưng không thể tìm thấy bất kỳ chuyển đổi nào.

Trả lời

13

Tôi thấy điều này trên thúc đẩy cam kết danh sách gửi thư: http://lists.boost.org/boost-commit/2009/04/15209.php

Sau đây là các chức năng có liên quan:

template < class Clock, class Duration> 
struct convert_to<posix_time::ptime, chrono::time_point<Clock, Duration> > { 
    inline static posix_time::ptime apply(const chrono::time_point<Clock, Duration>& from) 
    { 
     typedef chrono::time_point<Clock, Duration> time_point_t; 
     typedef chrono::nanoseconds duration_t; 
     typedef duration_t::rep rep_t; 
     rep_t d = chrono::duration_cast<duration_t>(from.time_since_epoch()).count(); 
     rep_t sec = d/1000000000; 
     rep_t nsec = d%1000000000; 
     return boost::posix_time::from_time_t(0)+ 
     boost::posix_time::seconds(static_cast<long>(sec))+ 
     #ifdef BOOST_DATE_TIME_HAS_NANOSECONDS 
     boost::posix_time::nanoseconds(nsec); 
     #else 
     boost::posix_time::microseconds((nsec+500)/1000); 
     #endif 
    } 
}; 

template < class Clock, class Duration> 
struct convert_to<chrono::time_point<Clock, Duration>, posix_time::ptime> { 
    inline static chrono::time_point<Clock, Duration> apply(const posix_time::ptime& from) 
    { 
     boost::posix_time::time_duration const time_since_epoch=from-boost::posix_time::from_time_t(0); 
     chrono::time_point<Clock, Duration> t=chrono::system_clock::from_time_t(time_since_epoch.total_seconds()); 
     long nsec=time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()); 
     return t+chrono::nanoseconds(nsec); 

    } 
}; 

Tôi không chắc chắn khi họ sẽ trở thành một phần của một thông cáo tăng. Họ dường như không có trong thân cây tăng cường ngay bây giờ ...

+9

Tìm tốt. Các hàm này xuất hiện để giả định rằng kỷ nguyên của Clock giống như thời gian của ptime: New Years, 1970. Nếu giả định đó là đúng, các hàm này hoạt động. Nếu không, các hàm này là lỗi thời gian chạy im lặng. –

+0

Có thể thực hiện đúng các chức năng này ngay cả khi các kỷ nguyên khác nhau? – HighCommander4

+4

Tôi tin rằng bạn có thể đến rất gần. Trước tiên tôi sẽ tạo một chrono tùy chỉnh :: đồng hồ (không cần phải là chrono không gian tên) có một kỷ nguyên của năm mới, năm 1970. Chuyển đổi giữa thời gian và Đồng hồ mới của bạn như được mô tả ở trên. Và sau đó bạn có thể khoảng chuyển đổi giữa hai đồng hồ chrono của bạn bằng cách nhận được ngay bây giờ() từ mỗi người trong số họ (ngay sau khi khác). Trừ time_since_epoch() của mỗi time_point để có được một khoảng thời gian là sự khác biệt giữa các epochs của hai đồng hồ chrono của bạn. Bạn cộng/trừ sự khác biệt đó để chuyển đổi giữa hai thời gian chrono. –

11

Bạn có thể chuyển đổi một time_t đến và đi từ một std :: chrono :: system_clock :: time_point:

class system_clock 
{ 
public: 
    ... 
    static time_t  to_time_t (const time_point& __t); 
    static time_point from_time_t(time_t __t); 
}; 

Và bạn có thể chuyển đổi một time_t đến một ptime:

ptime from_time_t(time_t t); 

Tuy nhiên tôi không thấy cách chuyển đổi thời gian thành một time_t.

+1

bạn có thể sử dụng to_tm của boost (ptime) để lấy cấu trúc tm và sau đó sử dụng mktime (...) từ time.h/ctime để lấy time_t. xem http://www.cplusplus.com/reference/ctime/mktime/ –

+1

Đảm bảo phần mềm của bạn sẽ không chạy sau năm 2038 https://en.wikipedia.org/wiki/Year_2038_problem –

+0

Để mở rộng nhận xét của @DarienPardinas , Các nền tảng Linux 32 bit sử dụng số nguyên 32 bit đã ký cho 'time_t'. Điều này sẽ dẫn đến một vấn đề Y2038. –

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