2011-08-18 3 views
1

현재 시간을 2011-08-18 10:11:12 -07:00으로 인쇄하고 싶습니다. 나는 숫자 형식으로 지정된 시간대를 가져 오는 중

#include <iostream> 

using namespace std; 

void time_to_string(time_t clock,const char *fmtstr) 
{ 
    char buf[256]; 
    if (strftime(buf, 256, fmtstr, localtime(&clock)) == 0) 
     buf[0] = 0; 
    cout << buf << endl; 
} 

int main() 
{ 
     time_to_string(time(NULL), "%Y-%m-%d %H%M%S %z"); 
} 

나는 2011-08-18 10:11:12 -0700로 시간을 표시 할 수 있지만 2011-08-18 10:11:12 -07:00으로 오전, 아래와 같은 코드를 개발했다. "%Y-%m-%d %H%M%S %:z"을 사용하면 2011-08-18 10:11:12 %:z가 생성됩니다.

C/C++에서 위의 작업을 어떻게 수행 할 수 있습니까?

답변

3

%z으로 작성된 문자열을 +hhmm 또는 -hhmm으로 수동으로 분할해야합니다. %z의 형식은 고정되어 있습니다. description of strftime을보십시오.

ISO 8601 : 2000 표준 형식 (+ hhmm 또는 -hhmm)에서 UTC의 오프셋으로 대체되거나 시간대가 결정되지 않으면 문자로 표시되지 않습니다.

날짜 및 시간으로 한 문자열을 작성하십시오. 두 번째 문자열에 %z으로 UTC 오프셋을 두 번째 문자열에 삽입하고 :을 두 번째 문자열에 삽입합니다. 첫 번째와 두 번째 문자열을 연결합니다.

1

% :을 (를) 해석하려고 시도하고 형식 지정자와 일치하지 않으므로 그대로 출력합니다. 하지만 당신은 아마 이미 알고 =)

당신의 time_to_string 함수에서, 나는 그것을 삽입하기 전에 수동으로 ':'를 버퍼에 삽입 할 것입니다.

0

결과 문자열을 수정하여 끝에 ':'을 수동으로 추가 할 수 있습니다. 예 :

buf[26]='\0'; 
buf[25]=buf[24]; 
buf[24]=buf[23]; 
buf[23]=':'; 

나는 더 나은 해결책을 간과 할 수 있습니다.

+0

버퍼의 데이터 길이에 대해 어떠한 가정도해서는 안됩니다. 먼저 버퍼를 0으로 설정 한 다음 데이터의 끝 부분을 결정해야합니다. – Nathanael

+0

그러나 당신은 buf에있는 데이터의 형식을 알고 있습니다 ... –

+0

'% z'는 변하지 않을 것이지만 문제는 그것이 오전 7시에 '% z'가 하나씩 이동한다는 것입니다. 코드가 실패합니다. –

1

시도한 구문이 존재하지 않습니다.

함수를 두 번 호출하는 것 : "%Y-%m-%d %H%M%S "으로 한 번, "%z"으로 한 번 수동으로 두 번째 문자열에 :을 추가 한 다음 두 개를 연결합니다. 레이아웃이 특정 데이터를 변경 가능성이 아니라고

buf2[5]=buf2[4]; 
buf2[4]=buf2[3]; 
buf2[3]=':'; 

strcat(buf,buf2); 

주를, 그래서 그렇게 추한 아니다 :

는 못생긴 버퍼 조작을 할 수는 : 삽입합니다.

0r 정말 과장, 정규식과 같은 경우. 하지만 외부 라이브러리가 필요합니다.

관련 문제