私は私のコメントで述べたように、すべての出力が間違っています。それはclangのバグだと思われます。 the Bugzilla page of the LLVM projectを検索しましたが、何も見つかりませんでした。あなたのサンプルコードでバグ報告を提出したいかもしれません。
回避方法は、std::sscanf()
で手動で文字列を解析し、std::tm
構造体を入力することです。次のコードは、入力文字列i
に対してこれを行います。 example with the output of std::get_time()
and the std::sscanf()
method at ideone全体を参照してください。文字列が異なる場合は、その解決策をニーズに合わせてください。
この解決方法は、フォーマット文字列として%d:%d:%d %d:%d:%d
を使用しています。またを使用すると、%
とd
の間の長さよりも小さいか等しい番号だけを受け入れることができます。
出力:
2016:07:30 09:27:06 | sscanf() time = 1469870826
2016:07:30 09:27:06 | std::get_time() time = 1469870826
2016:07:30 09:27:07 | sscanf() time = 1469870827
2016:07:30 09:27:07 | std::get_time() time = 1469870827
2016:07:30 09:27:08 | sscanf() time = 1469870828
2016:07:30 09:27:08 | std::get_time() time = 1469870828
コード:
#include <vector>
#include <string>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <sstream>
#include <cstring>
int main()
{
std::vector<std::string> vec;
vec.push_back("2016:07:30 09:27:06");
vec.push_back("2016:07:30 09:27:07");
vec.push_back("2016:07:30 09:27:08");
for (auto & i : vec)
{
struct std::tm tm;
/* std::sscanf() method: */
std::memset(&tm, 0, sizeof(tm));
if (6 != std::sscanf(i.c_str(), "%d:%d:%d %d:%d:%d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec))
{
return -1;
}
/* correct the numbers according to:
* see: http://en.cppreference.com/w/cpp/chrono/c/tm */
--tm.tm_mon;
tm.tm_year -= 1900;
/* mktime determines if Daylight Saving Time was in effect
* see: http://en.cppreference.com/w/cpp/chrono/c/mktime */
tm.tm_isdst = -1;
std::time_t time = std::mktime(&tm);
std::cout << i << " | sscanf() time = " << time << std::endl;
/************************************************************/
/* std::get_time() method: */
std::istringstream iss;
iss.str(i);
iss >> std::get_time(&tm, "%Y:%m:%d %H:%M:%S");
time = std::mktime(&tm);
std::cout << i << " | std::get_time() time = " << time << std::endl;
}
}
それが0さらにtm_year
メンバーから始まるので、tm_mon
の1を減算する必要がある1900年以降の年です。 description of std::tm
hereを参照してください。
さらに夏時間が有効であった場合std::mktime()
を決定させるために-1にtm_isdst
を設定するために必要とされます。
は、あなたの与えられたフォーマットの
std::string
に戻す
std::time_t
Linux timestampを変換するには:
%Y:%m:%d %H:%M:%S
あなたは
std::localtime()で
std::strftime()
を使用することができます。
See live example on ideone。
出力:
time = 1469870826 | 2016:07:30 09:27:06
コード:
#include <vector>
#include <string>
#include <iostream>
#include <ctime>
int main()
{
char buff[20];
time_t timestamp = 1469870826;
std::strftime(buff, sizeof(buff), "%Y:%m:%d %H:%M:%S", std::localtime(×tamp));
std::string timeStr(buff);
std::cout << "time = " << timestamp << " | " << timeStr;
}
、あなたの出力時間のすべてが間違っています。 https://www.epochconverter.com/によると、1469867226は土曜日、2016年7月30日8:27:06 AMにする必要があります。 [あなたのコードを実行すると、期待される結果が得られます](https://ideone.com/dUJqJ2)。 – user4581301
はい、すべての出力が間違っています。 [(gcc 6.3)でideone.comで動作するコード](https://ideone.com/A0ysc2)を参照してください。それが動作します。 'std :: get_time()'のclang実装がバグのようですか? –
@ user4581301ご意見ありがとうございます。確かに、正しい結果を得るためにg ++を使ってコンパイルして実行しました...私はclangのバグレポートを提出します。その間、この問題を回避する方法に関する提案はありますか? (私のQtアプリケーションでは、私は簡単に思いつくのを避けることはできません) –