2014-09-17 3 views
0

지정된 NSDate로 UTC 날짜를 가져와야합니다. 날짜가 일광 절약 기간에있는 경우 utcDate가 올바르게 계산되지 않습니다. 여기 OSX에서 현지 날짜로부터 UTC 날짜를 가져 오는 방법/변환 하시겠습니까?

내가 사용하는 코드입니다 :

NSDate *localDate = [updatesInfo objectForKey:@"date"]; 

NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; 
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
NSDate *utcDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

UPD :

나는 그것은 모든 응용 프로그램의 설치 내역이 포함 된 OSX 파일의 /Library/Receipts/InstallHistory.plist에서 LOCALDATE를 참조하십시오. https://www.dropbox.com/s/3pc178avr4pj7uj/1.png?dl=0

답변

1

NSDate 은 UTC로입니다. 항상.

게시 한 코드가 "updatesInfo"에 잘못된 NSDate가 있음을 나타냅니다. 적어도 잘못된 날짜가 있다고 생각합니다.

날짜를 만들 때 실수했을 수 있습니다. 부분적인 해결 방법으로 secondsFromGMTForDate를 사용해 볼 수 있습니다. 날짜가 정확하지 않기 때문에 DST가 변경된 시점과 매우 가까운 일부 날짜를 제외하면 대부분의 시간이 정확합니다. 다음과 같이 개선 할 수 있습니다.

NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMTForDate:localDate]; 
NSDate* betterDate = [localDate dateByAddingTimeInterval: -timeZoneOffset]; 
timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMTForDate:betterDate]; 
NSDate* utcDate = [localDate dateByAddingTimeInterval: -timeZoneOffset]; 
+0

plist : /Library/Receipts/InstallHistory.plist에서 localDate를 읽습니다. 그리고 올바르게 표시됩니다. – Sergio

+0

NSDate는 1970 년 이래로 초 수를 랩핑합니다. UTC로되어 있습니다. 당신이 그것을 만든 경우에만 문제가 될 수 있습니다 ..하지만 창조시에 –

+0

내 로컬 영역과 날짜를 저장하고 디버그 때 제대로 plist에 읽습니다 : https://www.dropbox.com/s/3pc178avr4pj7uj/1 .png? dl = 0 – Sergio

0

속성 목록 파일은 UTC로 날짜를 저장합니다. 당신이 일반 텍스트 편집기에서 파일을 열면 당신은 "2014년 7월 8일 세계 협정시 09시 30분 15초이"

<key>date</key> 
<date>2014-07-08T09:30:15Z</date> 

같은 것을 볼 수 있습니다. 따라서

NSDate *date = [updatesInfo objectForKey:@"date"]; 

는 정확한 날짜를 포함해야하며, 해당 지역의 시간대 그것을 조정할 필요가 없습니다.

Xcode 속성 목록 편집기 은 로컬 시간대에 따라 속성 목록 파일에 저장된 날짜를 표시합니다. 그리고 Xcode에서 날짜 필드를 편집하면 이 plist 파일에 저장하기 위해 UTC로 다시 변환됩니다.