2017-06-30 20 views
1

C++ 03でRFC3339タイムスタンプ( "1985-04-12T23:20:50.52Z")(つまりISO8601のサブセット)を解析するにはどうすればよいですか?私はBoostを使っていますが、Boost datetimeライブラリのどれもこれを行う関数を含んでいないようです。ブーストのRFC3339/ISO 8601タイムスタンプを解析する

実際の時間オブジェクトのタイプは、「今」と簡単に比較できる限り重要です。私は、UTCタイムゾーンのタイムスタンプだけを気にします。

+0

私は(Rベース)パッケージで[いつでも](https://github.com/eddelbuettel/anytimeを)ちょうどそれをやっていると思います - その 'SRC/anytime.cpp'を参照してください。 –

+0

例がありますか?私たちはハイパーリンクから質問を集めなければなりませんか? – sehe

+0

良い点、例を追加しました – Phil

答えて

1

ブーストを使用しないで、ちょうどstrptimeできます。 Using boost parse datetime string: With single digit hour format

注:することができますRFCリンクから採取したサンプルを

#include "adaptive_parser.h" 
#include <string> 
#include <iostream> 

int main() {  
    using namespace mylib::datetime; 

    adaptive_parser parser; 

    for (std::string const input : { 
      "1985-04-12T23:20:50.52Z", 
      "1996-12-19T16:39:57-08:00", 
      "1990-12-31T23:59:60Z", 
      "1990-12-31T15:59:60-08:00", 
      "1937-01-01T12:00:27.87+00:20", 
     }) 
    try { 
     std::cout << "Parsing '" << input << "'\n"; 
     std::cout << " -> epoch " << parser(input).count() << "\n"; 
    } catch(std::exception const& e) { 
     std::cout << "Exception: " << e.what() << "\n"; 
    } 
} 

プリントもちろん​​

Parsing '1985-04-12T23:20:50.52Z' 
-> epoch 482196050 
Parsing '1996-12-19T16:39:57-08:00' 
-> epoch 851042397 
Parsing '1990-12-31T23:59:60Z' 
-> epoch 662688000 
Parsing '1990-12-31T15:59:60-08:00' 
-> epoch 662688000 
Parsing '1937-01-01T12:00:27.87+00:20' 
-> epoch -1041335973 

、ここに掲載同じ_adaptive_parser_ヘルパーを想定し

サブセットの受け入れ可能なパターンの数を制限するあなたは必要です。

0

パーシングタイムゾーンの制限があります。

#include <sstream> 
#include <iostream> 
#include <string> 
#include <iomanip> 

int main() { 
    std::tm t = {}; 
    std::string s = "2016-01-02T15:04:05+09:00"; 
    int tz_offset = 0; 
    auto pos = s.find_last_of("+-Z"); 
    if (pos != s.npos) { 
    std::string zone = s.substr(pos); 
    tz_offset = std::atoi(zone.c_str()); 
    s.resize(pos); 
    } 
    std::stringstream ss(s); 
    ss >> std::get_time(&t, "%Y-%m-%dT%H:%M:%S"); 
    if (ss.fail()) { 
    std::cout << "Parse failed\n"; 
    } else { 
    std::time_t l = std::mktime(&t); 
    std::tm tm_utc(*std::gmtime(&l)); 
    std::time_t utc = std::mktime(&tm_utc); 
    tz_offset += (utc - l); 
    l = std::mktime(&t) - tz_offset; 
    t = *std::gmtime(&l); 
    std::cout << std::put_time(&t, "%c") << std::endl; 
    } 
} 
関連する問題