2011-05-12 3 views
48

나는 NSTimeZone 이러한 방법이 있음을 참조하십시오아이폰 시간대 편리한 메소드 사이의 차이는

defaultTimeZone 
localTimeZone 
systemTimeZone 

누군가가 간단한 용어 나에게 설명 할 수의 차이가 이러한 호출 beetween 무엇을, 언제 하나를 사용해야합니다 다른 대신에? 나는 이것에 대해 애플의 문서 내부에 아무것도 이해하지 못한다.

답변

70

문서의 언어는 약간 건조한 편이며, 이름의 유사성은 혼란을 야기 할 수 있습니다. 나는 여기에 NSTimeZone docs을 인용하고 설명하려고합니다 :

systemTimeZone
시간대

는 현재 시스템에 의해 사용. 현재 시간대를 결정할 수 없으면 GMT 시간대를 반환합니다.

이것은 장치가 있다고 생각하는 표준 시간대입니다. 자동으로 설정되고 기기의 물리적 위치와 일치하지만 설정 앱에서 사용자가 명시 적으로 특정 시간대를 설정 한 경우 사용자가 받게됩니다.

defaultTimeZone
현재 응용 프로그램의 기본 시간대

. 기본 시간대가 설정되지 않은 경우이 메서드는 systemTimeZone을 호출하고 시스템 시간대를 반환합니다.

응용 프로그램이 자체 표준 시간대를 설정하여 장치가 다른 영역에 있지만 시스템 표준 시간대 (및 다른 응용 프로그램)에 영향을주지 않는 것처럼 작업을 수행 할 수 있습니다. 설정은 setDefaultTimeZone:을 호출하여 수행됩니다. 이 작업을 수행하지 않았다면이 호출은 systemTimeZone과 동일합니다.

localTimeZone
현재 응용 프로그램의 기본 시간대에 모든 메시지를 전달하는 객체

. 현지 시간대는 항상 기본 시간대의 현재 상태를 나타냅니다.

여기가 조금 까다 롭습니다. localTimeZonedefaultTimeZone과 거의 같은 결과를 제공합니다. 차이점은 localTimeZone에서 가져온 NSTimeZone 인스턴스가 항상 앱 내의 시간대 설정을 항상 반영한다는 점입니다. 한 번 호출하여 결과를 저장하고 변경 사항에 관계없이 해당 객체를 통해 항상 현재 시뮬레이션 된 시간대를 가져올 수 있습니다. 마치이 NSTimeZone 인스턴스를 사용할 때 프레임 워크가 defaultTimeZone을 호출하여 항상 현재 값을 가져 오는 것과 같습니다.

위의 몇 가지 간단한 그림이 있습니다. systemTimeZone에서 다시 가져온 NSTimeZone 개체는 전화를 걸 때의 시스템 시간대를 나타냅니다. systemTimeZone에 다시 전화하면 사용자가 이후로 시간대를 변경해도 동일한 시간대가 표시됩니다. 귀하의 앱은 그 가치를 캐싱합니다. 업데이트를 받으려면 시스템에 resetSystemTimeZone으로 삭제 해달라고 요청해야합니다.

// Say that device is in GMT originally 
NSLog(@"%@", [NSTimeZone systemTimeZone]); // GMT 
// User flies into Rome and iPhone changes the zone automatically 
NSLog(@"%@", [NSTimeZone systemTimeZone]); // Still GMT 
[NSTimeZone resetSystemTimeZone]; // Clear app's cache 
NSLog(@"%@", [NSTimeZone systemTimeZone]); // Now GMT+2 

defaultTimeZone과 비슷한 일이 발생합니다. 이 메서드를 호출하면 나중에 setDefaultTimeZone:을 호출하더라도 항상 동일한 표준 시간대를 나타내는 개체가 생성됩니다. 그러나 localTimeZone에서 가져온 개체를 사용하면 기본 표준 시간대 *로 변경됩니다. localTimeZone 클래스 방법

, 당신이 자신을 발견하는 모든 컴퓨터의 기본 시간대되기 위해 자신을 디코딩하는 상대 시간대 개체를 얻을 수 있습니다 :

// Say that defaultTimeZone is originally GMT 
NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone]; 
NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone]; 
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]]; 
NSLog(@"%@", myDefaultTZ); // Still gives GMT 
NSLog(@"%@", [NSTimeZone defaultTimeZone]); // GMT-4, the new value 
NSLog(@"%@", myLocalTZ); // Also the new value! 

애플은 localTimeZonerecommend using 보인다 .


*이 localTimeZone 여전히 시스템 시간대의 응용 프로그램 수준의 캐시 될 수 있습니다. 기본값 인 시간대 설정에 따라 변경됩니다.

+0

defaultTimeZone과 localTimeZone의 차이점을 이해하지 못합니다. systemTimeZone 하나 또는 장치 위치가있는 경우 시스템 prefs 정의 된 이해합니다. defaultTimeZone은 앱에 시뮬레이션 된 것이거나 앱에서 시뮬레이션되지 않은 경우 시스템 1입니다. 그래서 ... localTimeZone은 무엇을 사용합니까? localTimeZone에 대해 말하는 것은 defaultTimeZone에 대해 말하는 것과 같은 것입니다. 그 시점에서 답을 완성 해 주시겠습니까? – Oliver

+0

@Oliver : 당신 말이 맞아요,'localTimeZone'은'defaultTimeZone'과 거의 같은 결과를줍니다. 내 대답의 유일한 차이점을 설명하려고 시도 :'localTimeZone'에서 가져온 특정'NSTimeZone' 객체는 항상 앱 내의 시간대 설정을 반영합니다. 객체를 한 번 호출하고 객체를 저장 한 다음 변경 사항에 관계없이 해당 객체를 통해 항상 현재 시뮬레이션 된 시간대를 가져올 수 있습니다. 마치이 객체를 사용할 때마다 프레임 워크가 매번'defaultTimeZone'을 호출하여 항상 현재 값을 가져 오는 것과 같습니다. 그게 도움이 되니? –

+0

분명합니다. 나는'localTimeZone'에 대한 호출 결과를 포함하는 변수를 사용하면 변경 사항을 반영한다는 것을 이해합니다. 그러나 이것은 'defaultTimeZone'의 결과를 포함하는 변수로는 발생하지 않습니다. 그게 맞습니까? – Oliver