C++ 03でRFC3339タイムスタンプ( "1985-04-12T23:20:50.52Z")(つまりISO8601のサブセット)を解析するにはどうすればよいですか?私はBoostを使っていますが、Boost datetimeライブラリのどれもこれを行う関数を含んでいないようです。ブーストのRFC3339/ISO 8601タイムスタンプを解析する
実際の時間オブジェクトのタイプは、「今」と簡単に比較できる限り重要です。私は、UTCタイムゾーンのタイムスタンプだけを気にします。
C++ 03でRFC3339タイムスタンプ( "1985-04-12T23:20:50.52Z")(つまりISO8601のサブセット)を解析するにはどうすればよいですか?私はBoostを使っていますが、Boost datetimeライブラリのどれもこれを行う関数を含んでいないようです。ブーストのRFC3339/ISO 8601タイムスタンプを解析する
実際の時間オブジェクトのタイプは、「今」と簡単に比較できる限り重要です。私は、UTCタイムゾーンのタイムスタンプだけを気にします。
ブーストを使用しないで、ちょうど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_ヘルパーを想定し
サブセットの受け入れ可能なパターンの数を制限するあなたは必要です。
パーシングタイムゾーンの制限があります。
#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;
}
}
私は(Rベース)パッケージで[いつでも](https://github.com/eddelbuettel/anytimeを)ちょうどそれをやっていると思います - その 'SRC/anytime.cpp'を参照してください。 –
例がありますか?私たちはハイパーリンクから質問を集めなければなりませんか? – sehe
良い点、例を追加しました – Phil