2016-01-23 88 views
4

在C++ 11中獲取日期和時間爲字符串的最先進的方式是什麼?C++ 11獲取當前日期和時間作爲字符串

我知道std::put_time,但參考文獻說我只能在流中使用它。

std::chrono::system_clock它提供to_time_t返回時間爲time_t和缺少日期,不是嗎?

我可以使用像bames53:Outputting Date and Time in C++ using std::chrono stringstream但似乎是一種解決方法。

+2

見http://en.cppreference.com/w/cpp/chrono/c/strftime。 – Lingxi

+0

就我個人而言,我會遠離std :: chrono,但這是你的電話。 abhishek ratore的答案在這方面是非常好的。 – SenselessCoder

回答

1

您可以使用下面給出的代碼片段,因爲它可以滿足您的目的。這裏使用time.h需要的頭文件localtime()函數然後用strftime()函數帶有必需的參數會給出輸出並以字符串形式返回它。

#include <iostream> 
#include <string> 
#include <time.h> 
std::string current_date(); 
std::string current_time(); 
int main(){ 
    std::cout<<"Current date => "<<current_date()<<"\n"; 
    std::cout<<"Current time => "<<current_time()<<"\n"; 
} 
std::string current_date(){ 
    time_t now = time(NULL); 
    struct tm tstruct; 
    char buf[40]; 
    tstruct = *localtime(&now); 
    //format: day DD-MM-YYYY 
    strftime(buf, sizeof(buf), "%A %d/%m/%Y", &tstruct); 
    return buf; 
} 
std::string current_time(){ 
    time_t now = time(NULL); 
    struct tm tstruct; 
    char buf[40]; 
    tstruct = *localtime(&now); 
    //format: HH:mm:ss 
    strftime(buf, sizeof(buf), "%X", &tstruct); 
    return buf; 
} 
3

首先,std::time_t確實抓住日期和時間,因爲它通常代表秒內從1月1日,1970年

有在C++ 11處理日期沒有支持。如果你不希望這樣做,大部分都是手動的,你仍然需要依賴提升。以下是如何手動完成的。

你可以在一個線程安全的方式—任何std::chrono::*clock使用—在一起,如std::system_clock,像這樣:

std::string get_date_string(std::chrono::time_point t) { 
    auto as_time_t = std::chrono::system_clock::to_time_t(t); 
    struct tm tm; 
    if (::gmtime_r(&as_time_t, &tm)) 
    if (std::strftime(some_buffer, sizeof(some_buffer), "%F", &tm)) 
     return std::string{some_buffer}; 
    throw std::runtime_error("Failed to get current date as string"); 
} 

別的地方,你可以發出:

get_date_string(std::system_clock::now()); 

相對較好有關此解決方案的一點是,在API級別上,您仍然使用現代的便攜式C++概念,如std::chrono::time_point,當然還有std::string

0

這樣的時間戳;

#include <iostream> 
#include <chrono> 
#include <ctime> 

int main() { 

    std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); 
    std::time_t start_time = std::chrono::system_clock::to_time_t(now); 
    char timedisplay[100]; 
    struct tm buf; 
    errno_t err = localtime_s(&buf, &start_time); 
    if (std::strftime(timedisplay, sizeof(timedisplay), "%H:%M:%S", &buf)) { 
     std::cout << timedisplay << '\n'; 
    } 
} 

以類似方式的日期。

0

簡單:

string CurrentDate() 
{ 
    std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); 

    char buf[100] = {0}; 
    std::strftime(buf, sizeof(buf), "%Y-%m-%d", std::localtime(&now)); 
    return buf; 
} 

調整格式適當的時間了。

請注意,由於std::localtime()返回一個指向內部結構的指針,因此我懷疑這對於多線程代碼不太適用。

4

使用Howard Hinnant's free, open-source header-only datetime library,即可獲得當前UTC時間爲std::string中的一行代碼:

std::string s = date::format("%F %T", std::chrono::system_clock::now()); 

我只是跑這一點,該字符串包含:

2017-03-30 17:05:13.400455 

這是正確的它甚至可以給你完整的精度。如果你不喜歡那種格式,所有的strftime格式標誌都可用。如果你想要你的當地時間,還有一個timezone library也可用,但它不只是標題。

輸出:

2017-03-30 13:05:13.400455 EDT 
+0

正在使用您的庫線程安全嗎? – carlo

+0

是的,date.h是100%線程安全的。它不使用底層線程不安全的C API,也不依賴線程不安全的實踐,例如設置環境變量。時區庫也是線程安全的,包括初次使用時區庫(取決於C++ 11線程安全函數本地靜態)的初始化。 –

+0

依賴於用戶提供的同步的唯一部分是在第一次使用後重新加載時區數據庫(在應用程序運行數月之後可能會用到的)時很少使用的功能。而這個特點是完整的記錄:https://howardhinnant.github.io/date/tz.html#database –