2016-08-05 10 views
2

日付の文字列をtime_tに保存してから元の文字列に戻したいと思います。文字列をtime_tに変換してからtime_tを文字列に変換します

しかし、意志の出力以下のコード出力の"2016-04-25_10:10:05"

そして時間はdate_strを変更することにより、不正確になります。

コードをstd::string date_str = "1470-04-25_09:10:05";に変更すると、 の結果が正しくなります。

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

int main() 
{ 
    // try changing year, hour will be incorrect 
    std::string date_str = "2016-04-25_09:10:05"; 

    std::tm tm{}; 
    std::istringstream str_stream(date_str); 
    str_stream >> std::get_time(&tm, "%Y-%m-%d_%T"); 
    std::time_t time = std::mktime(&tm); 

    std::stringstream stream; 
    stream << std::put_time(std::localtime(&time), "%F_%T"); 
    std::cout << stream.str() << std::endl; 
} 
+3

タイムゾーンの問題?あなたは何タイムゾーンですか?夏時間調整?詳細は 'tm'構造体をチェックしましたか(デバッガなど)? –

+0

1時間のギャップは意味があります...私が得意でないものは、1470年です。 – pah

+0

@JoachimPileborg同じマシンにあります。しかし、時間帯に依存しないようにする方法。 – Christophe

答えて

2

夏時間(DST)エネルギーを節約し、昼間の活用 を作るために使用されます。ここでは

はコードです。 カナダ、サンダーベイの1908で初めて使用されました。

これは、1908年以前(またはその前に、あなたのタイムゾーンが採用された夏時間)のいずれかの年が時間に影響する理由を説明しています。

あなたが前mktime()コールにtm.tm_isdstを設定していないため、また、 "2016-04-25_10:10:05" の場合に1時間のギャップに答える、これは次のとおりです。

/* Assuming that all tm memory is set to 0 prior to this */ 
tm.tm_isdst = -1; /* mktime() will figure out the DST */ 
std::time_t time = std::mktime(&tm); 

POSIX-1003.1-2001によると:

tm_isdstの正の値または0の値は、mktime()が と最初に夏時間がそれぞれに指定されているかどうかを推定するようにします。 tm_isdstの負の値を とすると、mktime()は夏時間( )が指定された時間有効であるかどうかを判断しようとします。

+0

による[この回答](http://stackoverflow.com/a/12115059/238902) '-1'は次のように解釈されます。 「不明」と予測できない可能性があります。代わりに '1'であってはなりませんか? – Default

+0

@Default標準を確認します。ホールドオン... – pah

+1

@Default更新を参照してください:) – pah