2011-08-15 4 views
0

저는 작업중인 앱에서 유닉스 타임 스탬프 (1970 년 이후)를 생성 할 수 있어야하기 때문에 실험을 시도했습니다. NSDate dateWithTimeIntervalSince1970 GMT/UTC 시간을 반환하지 않습니다.

NSLog(@"Getting timeIntervalSince1970"); 
    double theLoggedInTokenTimestampDateEpochSeconds = [[NSDate date] timeIntervalSince1970]; 

는 일 (1970 년 1 월 1 일부터 초) GMT에 (1970 년 이후) 반환 시대의 초를해야했습니다. 월 8월 15일 9시 54분 30초 2011 년에 실험을 수행 할 때 그러나, 그것은 1313427270.504315을 반환

시험이 내 맥 OS 터미널에서 간단한 펄 한 라이너, 내가 얻을 : 이 월 팔월 반환 perl -e 'print scalar(localtime(1313427270))'하는 15 09:54:30 2011 ...

내가 SF 베이 지역에 있고 내 로컬 시간대가 "쿠퍼 티노"로 설정되어있는 경우 이는 분명 GMT 시간이 아닙니다. 무슨 일이 일어나고 어떻게 해결할 수 있습니까? 사용자가 시간 스탬프를 입력 할 때마다 통신 할 때 내 앱이 서버에 UTC 시간을 보내도록해야합니다. 시간 스탬프는 하나의 동일한 유효한 시간대로 전송됩니다. - 서버에서 사용자의 요청 데이터는, 그것이 UTC에 보내지는 내 응용 프로그램의 다른 부분에서

다음과 같이 변환해서 표시됩니다 :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
    [dateFormatter setTimeZone:nil]; 
    [dateFormatter setDateFormat:@"yyyyMMdd"]; 
    NSDate *conversationDate = [NSDate dateWithTimeIntervalSince1970:[theConversationTimeStampString intValue]]; 
    NSString *conversationDateString = [dateFormatter stringFromDate:conversationDate]; 
    [dateFormatter release]; 

을이 아름답게 작동 - 표시 사용자의 시간대와 로케일에서 수정 된 시간 ... 그래서 나는 그것이 들어오는 타임 스탬프에 대해 수행되고 있음을 알고 있습니다. 그래서, 내가 GMT가되는 것을 멈추게하는 첫 번째 함수 (timeIntervalSince190)에 무엇이 잘못 되었습니까?

들으

+3

'1313427270.504315'는 GMT이고 1970 년 1 월 1 일 이후의 초 수이며 이것은 사용자가 어떤 시간대인지에 의존하지 않는 절대 값입니다. GMT의 '2011-08-15 16 : 54 : 30'과 캘리포니아의 '2011-08-15 09 : 54 : 30'에 해당합니다. 둘 다 같은 순간의 다른 표현입니다. – albertamg

답변

4

나는 그것이 표면에 보일 수도 있지만, 첫 번째 함수는 실제로 잘못 생각하지 않습니다. timeIntervalSince1970에서받는 시간 간격은 이 아니며은 GMT로 시간 간격을 반환합니다. 오히려, 현재와 1970 년 1 월 1 일 00:00:00 GMT 사이의 시간 간격을 반환합니다. 그것은 nitpick처럼 보일지도 모르지만, 중요합니다 : 간격 값은 고정 된 시점 이후의 초의 스칼라 수입니다. 간격 자체는 GMT가 아니며 고정 된 기준점 만 있습니다.

필자는 perl을 모르지만 현지 시간으로 문서를 빠르게 검색했으며 표준 시간 형식을 현지 시간으로 변환하여 인쇄하는 것으로 보입니다. 즉, 고정 된 지점을 설명하는 시간 간격이 해당 지점의 현지 시간으로 다시 변환됩니다. 명령 줄에서 표시하면 현지 시간이 다시 표시됩니다. 따라서 현지 시간으로 변환 된 절대 시간을 보는 것이 내가 기대하는 것입니다.

서비스가 UTC 시간을 얼마나 정확하게 수신하는지에 따라 시간 간격 값이 정상적으로 작동 할 가능성이 높습니다. 터미널 검사 이외의 것을 기반으로하지 않는다는 증거가 있습니까?

+2

그래서, 그것은 나빴다. 나는 스칼라 (localtime (1313427270))를 사용하고 있었다. 스칼라를 사용해야했습니다 (gmtime (1313427270)). 그건 저에게 perl GMT 버전의 타임 스탬프를 주었을 것입니다. 고마워, 팀! – Jann

관련 문제