2009-05-13 29 views

Trả lời

10

Xem: Date/time conversion: string representation to time_t

Và: [Boost-users] [date_time] So how come there isn't a to_time_t helper func?

Vì vậy, rõ ràng là một cái gì đó như thế này nên làm việc:

#include <boost/date_time/posix_time/posix_time.hpp> 
using namespace boost::posix_time; 

std::string ts("2002-01-20 23:59:59"); 
ptime t(time_from_string(ts)); 
ptime start(gregorian::date(1970,1,1)); 
time_duration dur = t - start; 
time_t epoch = dur.total_seconds();  

Nhưng tôi không nghĩ rằng nó sạch hơn nhiều so với Rob's suggestion: sử dụng sscanf để phân tích dữ liệu vào một số struct tm và sau đó gọi mktime.

+0

Cảm ơn bạn, nhưng một chỉnh sửa nhanh. Dòng cuối cùng phải là dur.total_seconds() –

+0

Đã khắc phục sự cố, cảm ơn nhận xét. – Reunanen

1
+0

Tôi cũng sẽ đề nghị điều này - ptime có time_from_string() để đi từ chuỗi này sang thời gian khác - nhưng làm thế nào để chuyển từ đó sang time_t? – Reunanen

+1

Vấn đề với date_time là a) bạn cần thư viện (không có phiên bản tiêu đề) và b) không hỗ trợ wstring. – dirkgently

3

Trên nền tảng Windows, bạn có thể làm một cái gì đó như thế này nếu không muốn sử dụng Boost:

// parsing string 
SYSTEMTIME stime = { 0 }; 
sscanf(timeString, "%04d:%02d:%02d %02d:%02d:%02d", 
     &stime.wYear, &stime.wMonth, &stime.wDay, 
     &stime.wHour, &stime.wMinute, &stime.wSecond); 

// converting to utc file time 
FILETIME lftime, ftime; 
SystemTimeToFileTime(&stime, &lftime); 
LocalFileTimeToFileTime(&lftime, &ftime); 

// calculating seconds elapsed since 01/01/1601 
// you can write similiar code to get time elapsed from other date 
ULONGLONG elapsed = *(ULONGLONG*)&ftime/10000000ull; 

Nếu bạn thích thư viện tiêu chuẩn, bạn có thể sử dụng tm struct và mktime() để thực hiện công việc tương tự.

+0

Btw, nếu bạn thấy mình sử dụng sscanf cho các chuỗi thời gian vào một cấu trúc tm, cho strptime một cái nhìn. Nó có một số định dạng thời gian cụ thể. Đối với các bên trên, bạn có thể sử dụng "% Y:% m:% d% H:% M:% S" –

+0

Tôi đã quên điều này, cảm ơn vì đã nhắc nhở :) – Rageous

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