2016-08-05 2 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) 에너지를 절약 일광을보다 효율적으로 사용할 을 만드는 데 사용됩니다 : 여기

는 코드입니다. 그것은 캐나다의 Thunder Bay에서 1908에서 처음 사용되었습니다.

이렇게하면 1908 년 이전 (또는 해당 시간대 이전에 DST가 적용됨)에 통과 한 연도가 시간에 영향을주는 이유를 알 수 있습니다.

/* 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.tm_isdst 이전 mktime() 호출 설정하지 않는 있기 때문에

또한, "2016-04-25_10:10:05"경우에 1 시간 간격으로 대답이다 tm_isdst에 대해 양수 또는 0 값을 지정하면 mktime()은 초기에 일광 절약 시간이 각각 에 해당하는지 여부를 추정합니다. tm_isdst의 음수 값이 일 경우 mktime()이 일광 절약 시간 이 지정된 시간 동안 유효한지 여부를 확인하려고 시도합니다.

+0

에 따르면 [이 답변] (http://stackoverflow.com/a/12115059/238902)'-1'은 '알 수 없음'이며 예측할 수 없을 수도 있습니다. 대신에'1'이 될까요? – Default

+0

@Default 표준을 확인하겠습니다. 잠시만 기다려주십시오 ... – pah

+1

@Default 업데이트보기 :) – pah

관련 문제