2011-12-06 15 views
1

誰も次のコードを書いた方がいいですか?ポータブルC++で時間文字列を解析する

boost::timeを使用しないでください。リンクの問題が発生するため、strptime()はmsvcにあるため使用できません。

#include <ctime> 

int strtomonth(string s) 
{ 
    const char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 
    for (int i=0;i<12;i++) 
     if (strcmp(months[i],s.c_str())==0) 
      return i; 
    return -1; 
} 

time_t get_compilation_time() 
{ 
    stringstream s; 
    s << __TIMESTAMP__; // formatted like "Tue Dec 6 13:42:54 2011" 
    string weekday,month; 
    int day,h,m,sec,year; 
    char colon; 
    s >> weekday >> month >> day >> h >> colon >> m >> colon >> sec >> year; 

    tm compile_time; 
    compile_time.tm_sec = 0; 
    compile_time.tm_min = 0; 
    compile_time.tm_hour = 0; 
    compile_time.tm_mday = day; 
    compile_time.tm_mon = strtomonth(month); 
    compile_time.tm_year = year-1900; 
    compile_time.tm_isdst = 0; 
    compile_time.tm_wday = 0; 
    compile_time.tm_yday = 0; 

    time_t cmptime = mktime(&compile_time); 
    return cmptime; 
} 

(私は「buildtime.h」を作成し、私のランタイム計算を保存するためのpythonまたは類似でプレビルドステップを作ることができ、この場合には感謝しますが、このようになりまし動作し、オーバーヘッドはありません私はそれに固執する問題)。

しかし...私はそれが間違って取得する場合、未定義の動作、コードの純粋に機能的な部分がどうあるべきかで参照、不潔...自分月の文字列を解析し、破棄されます変数を宣言すると、Cスタイルの構造体の初期化!より良い方法がありますか?

+1

申し訳ありませんが、最良ではない*良い方法をお探しですか(つまり、「ビルドタイム.hを作成してランタイム計算を保存するためのPythonなどのビルド前のステップを作成しますか? –

+1

良い方法がありますか?はい。ブーストとの忍耐。 (不特定の)「リンクの問題」に対処してください。 – aSteve

+0

ですから、tm_sec/tm_min/tm_hour = 0のままにしておけば、日付だけに興味がありますか? –

答えて

2

標準のC++ライブラリにある 'time_get'ファセットを見てみるとよいでしょう。 http://www.cplusplus.com/reference/std/locale/time_get/

これは、日付と時刻を解析するいくつかの機能を提供します。これはかなりベアボーンの実装であり、すべてのニーズに合わないことがあり

http://www.cplusplus.com/reference/std/locale/time_get/get_monthname/

http://www.cplusplus.com/reference/std/locale/time_get/get_weekday/

の位置は:最小限の例を見ることができます。

4

しかし、私が間違っていると、定義されていない振る舞いを持つCスタイルの構造体の初期化、純粋に機能的なコードでなければならないこと、捨てられる変数の宣言、 !より良い方法がありますか?

はい!外部ライブラリを使用してください。 (boost::timeのような)

私はそれがリンクの問題

を提起するようブースト::時間の使用を回避したいと思い

それは本当に難しいことではありません、ドキュメントのトンがコンパイル/実行するためにboostを取得することがあります。

既存のライブラリにリンクしたり、独自のライブラリを作成することは、常にトレードオフです。オーバーヘッドが低い/高いゲインを持つオプションを選択する必要があります。

+0

私が急いで昨日だったので、それをコンパイルする方法を理解するよりも上記のコードを書く方が速かったからです。これは私が求めていたはずの質問に対する正解ですが、そうではありません:) –