2013-04-10 2 views
0

time.h을 통해 얻은 gmtime에 시간과 분을 추가하는 미리 정의 된 방법이 있습니까? 다양한 국가의 시간을 표시하는 프로그램을 작성하고 싶습니다. 따라서 논리를 직접 작성해야합니까? 아니면 미리 정의 된 방법이 있습니까?gmtime에시와 분을 쉽게 추가하는 방법

+0

[zdump] (http://linux.die.net/man/8/zdump)와 (과) 유사합니까? (예 :'zdump US/Eastern') –

답변

3

필요한 작업을 수행하는 표준화 된 기능이 없습니다. 그러나 struct tm을 수정하면 비교적 간단하게 처리 할 수 ​​있습니다. struct는 여러 멤버를 보유합니다. 하나는 몇 시간 동안, 하나는 분당 하나. 구조체의 멤버를 업데이트하면 값을 정규화하기 위해 mktime을 호출해야합니다.

예를 들어 분이 이미 55로 설정되어 있고 10을 추가하면 65로 설정됩니다. mktime을 호출하면 분이 5로 설정되고 이에 따라 다른 구성원이 업데이트됩니다. 같을 것이다 십분를 추가하는 예를 들어

: 당신이 시간대 이름이있는 경우

struct tm *t = ... 
t->tm_min += 10; 
mktime(t); 
3

는 (같은 Europe/Helsinki 또는 US/Eastern 또는 MST)는 아주 쉬운 POSIX 인터페이스가있다.

전체 프로세스의 표준 시간대가 적용되므로 스레드를 사용하는 경우 동일한 표준 시간대를 사용하지 않는 한 동시 날짜/시간 액세스를 피하기 위해 날짜/시간 함수를 래핑해야합니다. 뮤텍스. 여기에 표시된 예제는 예제를 더 쉽게 이해할 수 있도록 스레드로부터 안전하지 않습니다.

먼저 환경 변수 TZ을 콜론으로 시작하는 표준 시간대 이름으로 설정하십시오. 이것은 POSIX 시스템에서 개별 프로세스의 시간대를 설정하는 데 사용되는 방법이며 프로세스의 모든 스레드에 영향을줍니다. 예 :

setenv("TZ", ":Europe/Helsinki", 1); 

은 헬싱키 표준 시간대를 설정합니다. 자세한 내용은 man 3 setenv을 참조하십시오. 그것만으로는 충분하지 않습니다. 당신은 또한 당신은 다음 글로벌 (Europe를 포함한다) 변수 tzname[0]tzname[1]을 (Helsinki를 포함해야 함) 실제로이었다 시간대 보려면 검사 할 수 있습니다

tzset(); 

를 호출하여, 현재의 시간대를 업데이트하는 C 라이브러리를 알려야합니다 세트. 자세한 내용은 man 3 timezone을 참조하십시오. 예 : 대신 사용자 정의 시간대를 지정하려면 POSIX 시간대 정의 구문을 사용하십시오.

위의 두 줄 이후에 localtime() 또는 localtime_r()을 사용할 때마다 선택한 시간대가 적용됩니다. 그것은 쉽습니다.


당신은 또한 특정 로케일을 준수하기 위해 타임 스탬프의 서식을 변경하려면, 당신은

setlocale(LC_TIME, "fi_FI.utf8"); 

주를 통해 (fi_FI.utf8에 말) 로케일을 설정할 수 있습니다 man 3 setlocale 맨 페이지로 로케일은 정식 형식이어야하며, fi과 같은 짧은 형식은 작동하지 않습니다. 다음에,점 buffer에서

time_t  now_time; 
struct tm *now_tm; 
char  *format; 
char  buffer[256]; 
size_t  length; 

time(&now_time); 
now_tm = localtime(&now_time); 
if (!now_tm) { 
    /* Error, cannot get local time corresponding to now_time! */ 
    return -1; 
} 

format = nl_langinfo(D_T_FMT); 
if (!format || !*format) { 
    /* Error, cannot get date-time formatting string for this locale */ 
    return -1; 
} 

/* Note: both now_tm and format point to static buffers, 
*  and they will be overwritten by subsequent calls. 
*/ 

length = strftime(buffer, sizeof buffer, format, now_tm); 
if (length < 1 || length >= sizeof buffer) { 
    /* Error in locale configuration; cannot generate date-time string. */ 
    return -1; 
} 

핀란드 시간대의 날짜와 시간 핀란드어 (또는 무엇이든 마지막 setlocale(LC_TIME, locale) 호출에 설정된 로케일), 포함 (또는 어떤 시간대는 마지막 setenv("TZ", ":Europe/Helsinki", 1); tzset(); 전화에서 설정).

(최종 검사는 일부 매우 오래된 시스템과 호환되며 버퍼가 너무 작 으면 sizeof buffer을 반환합니다. 최신 시스템에서는 버퍼가 충분히 클 때이를 반환하지만 256 바이트로 충분할 것으로 예상합니다.

POSIX 계열 시스템에서 로켈 (언어 및 형식)과 시간대가 완전히 별개이므로이 점을 지적하고 싶습니다.

관련 문제