2012-04-23 70 views
11

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?

+2

[Boost.DateTime] (http://www.boost.org/libs/date_time) đã định dạng cơ sở I/O. – ildjarn

+0

Với một hoặc hai câu, đó có thể là câu trả lời (?), @ildjarn – Jasper

+2

@ 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

Trả lời

27

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ừ đó.

+0

Chỉ muốn lưu ý gcc vẫn thiếu hỗ trợ cho put_time:/ –

7

Tôi muốn thử std::put_time. Xem link here để biết thông tin về cách sử dụng. Nó hỗ trợ các chuỗi định dạng đầy đủ và như vậy.

+5

Cần lưu ý rằng giải pháp này là C++ 11-only. – ildjarn

+2

Vẫn chưa được triển khai (gcc 4.8.1). – Avio

1

MFC có COleDateTime trong đó có một contructor mất time_t (hoặc __time64_t) và có phương thức Format.

1

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ự.

+0

'ctime (& curtime)', trong đó time_t curtime; tham khảo: http://www.tutorialspoint.com/c_standard_library/c_function_ctime.htm – parasrish

2
CTime obj1(time_tObj); 

CString s = obj1.Format("%a %b %d %H:%M:%S %Y"); 
1

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

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