私のプログラムでは、いくつかの異なる形式で時折読みなければなりません。しかし、すべてのフォーマットでは、時間はUTC(すなわち、私のローカルタイムゾーンではない)で与えられます。日付文字列と書式文字列を取り、std::time_t
のタイムスタンプを出力する関数の最適な方法は何ですか?標準時から文字列をUTC時刻として読む
現在、私はブースト
#include "boost/date_time/gregorian/gregorian.hpp"
#include "boost/date_time/posix_time/posix_time.hpp"
std::time_t to_timestamp_utc(const std::string& _dateString) {
using namespace boost::gregorian;
using namespace boost::posix_time;
return to_time_t(ptime(from_undelimited_string(_dateString)));
}
を使用していますが、これは唯一の "YYYYMMDD" 形式のために働きます。一方、標準ライブラリ関数std::get_time
は、入力日付がUTCではなくローカル時間でフォーマットされていると仮定しています(または、少なくとも私はそれを変更する方法を見つけていません)。どんな提案も大歓迎です。
最新の解決策 Maxim Egorushkinの提案に基づいています。ここ
std::time_t utc_to_timestamp(const std::string& _dateString, const std::string& _format) {
// Set sec, min, hour to zero in case the format does not provide those
std::tm timeStruct;
timeStruct.tm_sec = 0;
timeStruct.tm_min = 0;
timeStruct.tm_hour = 0;
char* const result = strptime(_dateString.c_str(), _format.c_str(), &timeStruct);
// Throw exception if format did not work
REQUIRE(result == _dateString.c_str()+_dateString.size(), "Failed to parse dateTime.");
return timegm(&timeStruct);
}
どのフォーマットが必要ですか? (UK、US、?) –
期待するフォーマットを知る必要があります。例えば。 「07-06-2016」は米国ではmm-dd-yyyy、EUではdd-mm-yyyyのため、曖昧です。 –
@BiagioFesta私は主に 'yyyy-mm-dd hh:mm:ss'、' yyyymmdd'と 'dd.mm.yyyy hh:mm'を必要としますが、関数を引数として任意の形式例えば 'std :: get_time'が実行します。 – Haatschii