2017-11-10 3 views
0

ftime과 gettimeofday는 Ubuntu 16에서 현재 시간대에 대해 0을 반환합니다. 시간대는 Ubuntu에서 제공하는 날짜 및 시간 설정에서 올바르게 설정됩니다. TZ env 변수 세트가 없습니다.왜 gettimeofday 시간대가 잘못 되었습니까?

많은 다른 상황에서 사용되는 프로덕션 소프트웨어이기 때문에 "수정"하고 싶지 않습니다. 그래서 나는 프로그래밍 방식으로 시간대 (그리고 현재의 DST 오프셋을 선호)를 얻는 안정적인 방법을 원한다.

내 시도까지 :

[email protected]:~$ date +%Z 
AEDT 
[email protected]:~$ date +%z 
+1100 

난 그냥 "날짜"를 호출 할 프로세스를 생성 할 수 있지만 그 때 손으로 매우 무거운 것 같다

#if 0 
timeb tbTime; 
ftime(&tbTime); 
int CurTz = -tbTime.timezone; 
#else 
struct timeval tv; 
struct timezone tz; 
int r = gettimeofday(&tv, &tz); 
if (r) 
    return NO_ZONE; 

int CurTz = tz.tz_minuteswest; 
#endif 

'기간'명령이 작동한다 일부 API 호출을 사용할 수 있습니다.

+0

나를 위해 올바르게 작동합니다 (TZ env도 정의 됨). OSX에서 테스트되었습니다. –

+0

아마도 다른 시스템에는 다른 설정이 있기 때문일 수 있습니다. 그 코드는 Windows에서 잘 작동합니다. 어쩌면 제 우분투가 어떻게 든 파열 됐을까요? 하지만 현장에서 비슷한 "파열 된"시스템에서 작동하도록해야합니다. – fret

답변

1

GNU/Linux에서 gettimeofday의 두 번째 인수는 매우 유용하지 않으며 항상 NULL이어야합니다. manual page for gettimeofday은 다음과 같이 말합니다.

타임 존 구조의 사용은 더 이상 사용되지 않습니다. tz 인수는 일반적으로 NULL로 지정되어야합니다. 비록 리눅스가 아닌 시스템에

tz_dsttime 쓸모 의미가 있습니다 (예를 들어, 그것은 전에 칠십년에 대한 짧은 기간 동안 그렇게 때문에 인도는 DST를 사용하는 보고서).

현재 시간대를 얻으려면 localtime 또는 localtime_r을 사용하고 생성 된 고장 시간 구조 (daylight과 같은 전역 변수가 아닌)를 검사해야합니다. 관심있는 회원 struct tmtm_isdst, tm_gmtoff 및 아마도 tm_zone입니다. 후자의 두 가지는 glibc 확장입니다.

+0

그래, 나는 아직도 내가 localtime에서 원하는 것을 얻을 수 없다. "date"명령이 반환하는 정보를 얻기위한 API가 있습니까? – fret

+0

'localtime' 또는'localtime_r'을 사용할 수 있습니다. 나는 나의 대답을 분명히했다. –

관련 문제