2013-06-20 11 views
39

Tôi đã nâng cấp một số mã cũ và đã cố gắng cập nhật lên C++ 11 nếu có thể. Các mã sau đây là cách tôi dùng để hiển thị thời gian và ngày trong chương trình của tôiXuất ngày và giờ bằng C++ sử dụng std :: chrono

#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <time.h> 

const std::string return_current_time_and_date() const 
{ 
    time_t now = time(0); 
    struct tm tstruct; 
    char buf[80]; 
    tstruct = *localtime(&now); 
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); 
    return buf; 
} 

Tôi muốn đầu ra thời gian hiện tại và ngày trong một định dạng tương tự như sử dụng std :: chrono (hoặc tương đương) nhưng không chắc chắn như thế nào để làm như vậy. Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn

+0

Vui lòng tra cứu nếu đã có câu hỏi như vậy và nếu không thì hãy hỏi. – legends2k

+0

* Có thể trùng lặp: * http://stackoverflow.com/questions/12346260/c-date-and-time – legends2k

+3

Bạn sẽ không nhận được tốt hơn nhiều với C++ 11. chrono là nhiều hơn về thời gian (bao lâu đã làm một cái gì đó mất) so với công cụ loại thời gian trong ngày. Bạn có thể kiểm tra thời gian tăng ngày, mặc dù. Nó có chức năng ngày và giờ mạnh mẽ hơn. –

Trả lời

63

Thư viện <chrono> chỉ đề cập đến thời gian và không phải ngày, ngoại trừ system_clock có khả năng chuyển đổi thời gian của nó thành time_t. Vì vậy, việc sử dụng <chrono> cho các ngày sẽ không cải thiện được nhiều thứ. Hy vọng rằng chúng tôi có được một cái gì đó như chrono::date trong tương lai không xa.

Điều đó nói rằng, bạn có thể sử dụng <chrono> theo cách sau:

#include <chrono> // chrono::system_clock 
#include <ctime> // localtime 
#include <sstream> // stringstream 
#include <iomanip> // put_time 
#include <string> // string 

std::string return_current_time_and_date() 
{ 
    auto now = std::chrono::system_clock::now(); 
    auto in_time_t = std::chrono::system_clock::to_time_t(now); 

    std::stringstream ss; 
    ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); 
    return ss.str(); 
} 

Lưu ý rằng std::localtime có thể gây ra các cuộc đua dữ liệu. localtime_r hoặc các chức năng tương tự có thể có sẵn trên nền tảng của bạn.

Cập nhật:

Sử dụng một phiên bản mới của Howard Hinnant của date library bạn có thể viết:

#include "date.h" 
#include <chrono> 
#include <string> 
#include <sstream> 

std::string return_current_time_and_date() { 
    auto now = std::chrono::system_clock::now(); 
    auto today = date::floor<days>(now); 

    std::stringstream ss; 
    ss << today << ' ' << date::make_time(now - today) << " UTC"; 
    return ss.str(); 
} 

này sẽ in ra một cái gì đó như "2015/07/24 05: 15: 34,043473124 UTC".


Trên ghi chú không liên quan, trả lại các đối tượng const trở nên không mong muốn với C++ 11; không thể di chuyển các giá trị trả về const. Tôi cũng đã xóa bỏ dấu sau bởi vì dấu sau chỉ hợp lệ cho các hàm thành viên và hàm này không cần phải là thành viên.

+7

Hãy coi chừng rằng một số trình biên dịch cũ có thể không nhận ra 'std :: put_time'. Một khi tôi đã cố gắng để biên dịch mã của tôi đã có 'std :: put_time' trên CentOS 7 bằng cách sử dụng g ++, nó không thành công. Trạng thái hỗ trợ 'std :: put_time' trong GCC http://stackoverflow.com/q/14136833/4694036 – LETs

+2

Cập nhật tuyệt vời. +1 ;-) –

+0

là có chức năng C++ tương tự như std :: put_time nhưng để trả về chuỗi? – Nick