FlyHigh
199
2018-10-25 09:31:31
2
429

C언어 시간 관련 질문입니다.


#include <time.h>

int main()

{

double stime = 19700101000000;

double ltime = 20181025080101;


time_t     u_time;

struct tm  user_stime;

struct tm *ptr_stime;


user_stime.tm_year = 1970 - 1900;   // 주의 :년도는 1900년부터 시작

user_stime.tm_mon = 1 - 1;      // 0 - 11

user_stime.tm_mday = 2 ; //1-31

user_stime.tm_hour = 0;  //0~23

user_stime.tm_min = 0; //0~59

user_stime.tm_sec = 0; //0-61

user_stime.tm_isdst = 0;           // 썸머 타임 사용 안함


u_time = mktime(&user_stime);

ptr_stime = localtime(&u_time);


char buf[50];


sprintf_s(buf, "%04d년 %02d월 %02d일 %02d시 %02d분 %02d초 ",

ptr_stime->tm_year + 1900, ptr_stime->tm_mon + 1, ptr_stime->tm_mday,

ptr_stime->tm_hour, ptr_stime->tm_min, ptr_stime->tm_sec

);


printf(buf); //1970년 1월 2일 00시 00분 00초



위와같은 소스로 1970년 1월 2일 00시 00분 00초는 만들었는데...

mday를 2에서 1로 변경 즉.. 1970년 1월 1일 00시 00분 00초를 만들려고 하면 에러가 떨어지네요;;
예외가 발생하였다고 읽기 액세스 위반;; ptr_stime이 nullptr였습니다.라고 뜨네요;;

혹시 원인 아시는분 계시낙요?

0
0
  • 답변 2

  • MinorLife
    47
    2018-10-26 10:31:45 작성 2018-10-26 10:34:26 수정됨

    ※ VS2013, MSVC (v120), 윈 7 환경에서 테스트했습니다.


    https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/d1y53h2a(v=vs.120)


    Remarks 3번째 문단에 UTC에 관한 이야기가 있네요. 짧은 영어라 정확한 해석은 아니지만 .. ^^;

    "UTC에 따라 처음에 가감을 가한 뒤부터 맞추기 때문에, 가감된 값이 범위를 넘어설 수 있다.." 정도같네요.


    1970년 1월 1일 9시 (저희는 UTC+9 니까..) 로 하면 잘 나오네요..

    윈도우 환경이시라면.. 다른 문서에는 _mkgmtime() 등을 사용하는 것도 고려해보라고 써있구요.


    늦은 답이라서 이미 해결하셨을 것 같지만 ㅎㅎ;;

    다른 분들께라도 도움이 되시리라 믿고 남겨봅니다.

    0
  • MinorLife
    47
    2018-10-26 10:47:11 작성 2018-10-26 10:48:26 수정됨

    ※ 추가.. MSVC 외에서는 표준(?)으로 UTC 이야기가 마찬가지로 들어맞는가?


    https://en.cppreference.com/w/c/chrono/mktime

    https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/mktime.htm


    마찬가지로 local calander time 이라던가 현재 로케일에 영향을 받는다던가 하는 이야기가 있는 걸 보니,

    MSVC 외에서도 같은 방식으로 표준시에 대해 가감 후 연산하는 것이라고 생각되네요.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.