2013-06-20 16 views
39

私はいくつかの古いコードをアップグレードしており、可能であればC++ 11に更新しようとしています。次のコードは、私は、出力と同様の形式で現在の日付と時刻をSTDを使用したいと思います::クロノ(または類似)std :: chronoを使ってC++で日付と時刻を出力する

#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; 
} 

私のプログラムで時刻と日付を表示するために使用される方法ですが、方法がわかりませんよそうすることに行く。どんな助けでも大歓迎です。ありがとう

+0

既にこのような質問がありましたら参照してください。そうでない場合は質問してください。 – legends2k

+0

*可能重複:* http://stackoverflow.com/questions/12346260/c-date-and-time – legends2k

+3

あなたはC++ 11でもっと良くなるつもりはありません。クロノは時間のタイプのものよりもタイミング(何かがどれくらい時間がかかったか)に関するものです。しかし、あなたはBoost Date Timeをチェックするかもしれません。より堅牢な日時機能を備えています。 –

答えて

63

<chrono>ライブラリは、時刻をtime_tに変換する能力を持つsystem_clockを除いて、時間だけで日付は処理しません。したがって、<chrono>を日付に使用しても、物事はあまり改善されません。うまくいけば、それほど遠くない将来にchrono::dateのようなものが得られることを願っています。

#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(); 
} 

std::localtimeことはデータ競合が発生する可能性があります、あなたは次のように<chrono>を使用することができると述べた

localtime_rまたは類似の機能がご使用のプラットフォームで使用可能な場合があります。

更新:あなたが書くことができハワードヒナントのdate libraryの新しいバージョンを使用して

: "34.043473124 UTC:15 2015年7月24日05"

#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(); 
} 

これは次のように出力します。無関係なノートで


constオブジェクトを返すと、C++ 11で望ましくないとなっています。 constの戻り値をから移動することはできません。後続のconstはメンバ関数に対してのみ有効であり、この関数はメンバである必要がないので、後続のconstも削除しました。

+7

古いコンパイラでは 'std :: put_time'を認識できないことに注意してください。一旦、g ++を使ってCentOS 7で 'std :: put_time'を持つコードをコンパイルしようとすると、失敗しました。 GCCの 'std :: put_time'サポートのステータスhttp://stackoverflow.com/q/14136833/4694036 – LETs

+2

素晴らしいアップデートです。 +1 ;-) –

+0

C++関数はstd :: put_timeと似ていますが、文字列を返しますか? – Nick

関連する問題