2017-08-17 4 views
1

文字列データをstruct tm(c)またはstd::chrono::time_pointに変換したいと思います。問題は、標準のlibc(glibcとmusl)の両方のソリューションを動作させたいということです。私は解析したい木の標準フォーマットを持っています。は、データ/時刻をmuslとglibcに対してtm/time_pointに変換します。一般的な方法

  1. RFC-1123

    日、1994年11月6日午前8時49分37秒GMT

  2. RFC-850

    「日曜日、 06-Nov-94 08:49:37 GMT「

  3. ANSI Cのいるasctimeフォーマット

    日11月6日午前8時49分37秒1994"

はそれを動作させる方法はありますか? std::get_timeにはbug
strptimeがありますがglibcではうまく動作しますが、muslに対しては失敗します。

get_timeのようなストリームを使用したくありません。しかし、それが必要ならば、大丈夫です。 (それはGCC5を使用しても大丈夫だ>とC++ 11標準)

答えて

1

Howard Hinnant's free, open source, header-only, date/time libraryも、障害のあるget_timestrptime施設のコンテキストで、std::chrono::time_pointにこれらのフォーマットを解析することができます。しかし、それはstd::istringstreamの使用を必要とします。ここでは、次のようになります。これは、このように行使することができ

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

std::chrono::system_clock::time_point 
parse_RFC_1123(const std::string& s) 
{ 
    std::istringstream in{s}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%a, %d %b %Y %T %Z", tp); 
    return tp; 
} 

std::chrono::system_clock::time_point 
parse_RFC_850(const std::string& s) 
{ 
    std::istringstream in{s}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%a, %d-%b-%y %T %Z", tp); 
    return tp; 
} 

std::chrono::system_clock::time_point 
parse_asctime(const std::string& s) 
{ 
    std::istringstream in{s}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%a %b %d %T %Y", tp); 
    return tp; 
} 

#include <iostream> 

int 
main() 
{ 
    auto tp = parse_RFC_1123("Sun, 06 Nov 1994 08:49:37 GMT"); 
    using namespace date; 
    std::cout << tp << '\n'; 
    tp = parse_RFC_850("Sunday, 06-Nov-94 08:49:37 GMT"); 
    std::cout << tp << '\n'; 
    tp = parse_asctime("Sun Nov 6 08:49:37 1994"); 
    std::cout << tp << '\n'; 
} 

出力:

1994-11-06 08:49:37.000000 
1994-11-06 08:49:37.000000 
1994-11-06 08:49:37.000000 

解析フラグ%a%bは、通常はロケールに依存しています。ただし、-DONLY_C_LOCALE=1でこのライブラリをコンパイルすると、ロケールに依存しないになります。 と同じ結果を返すはずです。しかし、実用的な観点から、-DONLY_C_LOCALE=1なしでコンパイルしても上記の結果が得られない場合は、std :: libベンダーにバグレポートを提出する必要があります。あなたは-DONLY_C_LOCALE=1をコンパイルし、あなたは、上記の結果を得る私のケージをガタガタ、および時間ではない場合、私はそれは、日中に固定されていますしていない場合は

+0

ありがとうございました! –

+0

お返事ありがとうございます!私はあなたの機能についていくつかのベンチマークを行いました。私はあなたのソリューションがなぜRFC850の場合の 'sprintf'より速いのか理解できません。あなたはストリームを使用しています。ベンチマークは[こちら](https://github.com/oktal/pistache/pull/102#issuecomment-322527542)にあります。 –

+0

おかげで、ありがとう。 –

関連する問題