2009-07-22 4 views
10

Tôi cần phải chuyển đổi gấp đôi với số giây kể từ kỷ nguyên thành ptime. Tôi chắc chắn phải có một cách dễ dàng để làm điều này, nhưng tôi không thể tìm thấy bất cứ điều gì. Cảm ơn.dấu thời gian unix để tăng :: posix_time :: ptime

Chỉnh sửa: Dấu thời gian ban đầu là dấu phẩy động. Tôi không thể thay đổi nó và tôi không muốn mất độ chính xác phụ thứ hai.

+0

Bạn chắc chắn bạn cần gấp đôi? Tôi nghĩ rằng nó phù hợp trong một int. – slipbull

+1

Có, tôi cần gấp đôi - đó là một phần của giao diện mà tôi không thể thay đổi. Nếu đó là một số giây sau đó bạn không thể nắm bắt phần phân đoạn ... và http://xkcd.com/607/ :-) – cube

Trả lời

5

sau khi một số quan trọng xung quanh tôi đến với điều này:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321)) 

Tôi không chắc chắn đây là giải pháp tốt nhất, nhưng có vẻ như để làm những gì tôi cần.

8

Sử dụng chức năng chuyển đổi from_time_t(). A time_t là dấu thời gian UNIX, tức là số giây kể từ thời đại.

+1

time_t không thể chứa các phần phân đoạn của giây, nhưng cảm ơn câu trả lời – cube

+0

' time_t' là dấu thời gian UNIX trên hầu hết mọi nền tảng, nhưng chuẩn C++ không xác định hành vi này. Vì vậy, hãy cẩn thận với bản dịch này. –

7

Đối với một máy tính mà có ngày tăng/thời gian biên soạn để mức mặc định độ phân giải micro, hãy thử này:

double ts = 1250524800.5; 
// Use floor() here if seconds are always positive. 
time_t secondsSinceEpoch = floor(ts); 
long microsecondsSinceSecond = 
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000); 
boost::posix_time::ptime result = 
    boost::posix_time::from_time_t(secondsSinceEpoch); 
boost::posix_time::time_duration fractionalSeconds(0, 0, 0, 
                microsecondsSinceSecond); 
result += fractionalSeconds; 
cout << "Time stamp is " << result << endl; 

Kết quả của việc này là "Thời gian tem là 2009-Aug-17 16:00: 00.500000 "trên hộp linux của tôi.

+2

Bạn có thể muốn thêm một '+ 0,5' vào phép tính' microecondsSinceSecond' của bạn để có được vòng tới gần nhất. Nếu không, bạn sẽ bị lỗi cắt ngắn. Mặc dù ... Tôi đoán bất cứ ai quan tâm đến sự khác biệt của một nửa của một micro giây có lẽ sẽ không lưu trữ một dấu thời gian trong một 'đôi' ở nơi đầu tiên. – Tom

+0

@Tom: Bạn đã chính xác ở đây, mặc dù tôi hy vọng rằng bất kỳ ai thực sự quan tâm đến mức độ phân giải này sẽ định cấu hình phân phối Boost của họ cho hỗ trợ nano giây và thực hiện các thay đổi thích hợp cho mã ở trên. –

+0

+1 Đoạn mã lớn chiếm phần thập phân. –