Giả sử tôi có cấu trúc time_t và tm. Tôi không thể sử dụng Boost nhưng MFC. Làm thế nào tôi có thể làm cho nó một chuỗi như sau?Cách định dạng chuỗi ngày và giờ bằng C++
Mon Apr 23 17:48:14 2012
Đang sử dụng chạy nước rút theo cách duy nhất?
Giả sử tôi có cấu trúc time_t và tm. Tôi không thể sử dụng Boost nhưng MFC. Làm thế nào tôi có thể làm cho nó một chuỗi như sau?Cách định dạng chuỗi ngày và giờ bằng C++
Mon Apr 23 17:48:14 2012
Đang sử dụng chạy nước rút theo cách duy nhất?
Thư viện C bao gồm strftime
dành riêng cho định dạng ngày/giờ. Các định dạng mà bạn đang yêu cầu cho dường như tương ứng với một cái gì đó như thế này:
char buffer[256];
strftime(buffer, sizeof(buffer), "%a %b %d %H:%M:%S %Y", &your_tm);
Tôi tin std::put_time
sử dụng một chuỗi định dạng tương tự, mặc dù nó làm giảm các bạn vì phải đối phó một cách rõ ràng với một bộ đệm. Nếu bạn muốn viết đầu ra vào một dòng, nó khá thuận tiện, nhưng để có được nó thành một chuỗi đó không phải là nhiều sự giúp đỡ - bạn sẽ phải làm một cái gì đó như:
std::stringstream buffer;
buffer << std::put_time(&your_tm, "%a %b %d %H:%M:%S %Y");
// now the result is in `buffer.str()`.
std::put_time
là mới với C++ 11, nhưng C++ 03 có một khía cạnh time_put
trong ngôn ngữ có thể cũng làm như vậy. Nếu bộ nhớ phục vụ, tôi đã xoay xở để làm cho nó hoạt động một lần, nhưng sau đó quyết định nó không có giá trị rắc rối, và tôi đã không làm điều đó kể từ đó.
Chỉ muốn lưu ý gcc vẫn thiếu hỗ trợ cho put_time:/ –
MFC có COleDateTime
trong đó có một contructor mất time_t
(hoặc __time64_t
) và có phương thức Format
.
ctime()
tạo chuỗi ở định dạng đó. Phải mất một con trỏ đến một time_t
.
Ngoài ra còn có asctime()
có con trỏ đến struct tm
và thực hiện tương tự.
'ctime (& curtime)', trong đó time_t curtime; tham khảo: http://www.tutorialspoint.com/c_standard_library/c_function_ctime.htm – parasrish
CTime obj1(time_tObj);
CString s = obj1.Format("%a %b %d %H:%M:%S %Y");
Nếu bạn cần phải lo lắng về định dạng trên các ngôn ngữ khác nhau, đừng quên khởi chạy CRT với ngôn ngữ hiện tại. Điều này cũng ảnh hưởng đến COleDateTime.
setlocale(LC_COLLATE,“.OCP”); // sets the sort order
setlocale(LC_MONETARY, “.OCP”); // sets the currency formatting rules
setlocale(LC_NUMERIC, “.OCP”); // sets the formatting of numerals
setlocale(LC_TIME, “.OCP”); // defines the date/time formatting
Xem bài đăng trên blog của tôi có liên quan đến các bài viết MSDN và các nguồn khác. http://gilesey.wordpress.com/2012/12/30/initailizing-mfccrt-for-consumption-of-regional-settings-internationalizationc
[Boost.DateTime] (http://www.boost.org/libs/date_time) đã định dạng cơ sở I/O. – ildjarn
Với một hoặc hai câu, đó có thể là câu trả lời (?), @ildjarn – Jasper
@ Jasper: Trong khi tôi sử dụng thư viện, tôi thấy giới thiệu nó cho người khác khó khăn vì tài liệu quá khủng khiếp. Tôi chỉ để lại một bình luận để OP có thể theo đuổi điều đó một mình nếu họ chọn (ví dụ: có rất nhiều câu trả lời SO thể hiện chính xác điều này, chẳng hạn như [this one] (http://stackoverflow.com/a/5697577/636019)). – ildjarn