[cocoa] NSUserDefaults에 NSDate를 저장하는 가장 좋은 방법은 무엇입니까?

NSUserDefaults에 NSDate를 저장하는 두 가지 방법이 있습니다.

옵션 1-setObject : forKey :

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];

옵션 2-timeIntervalSince1970

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];

장점과 단점

옵션 1

이것은 작고 논리적 인 것 같습니다. 그러나 Date Formatter 버그로 인해 이것이 잘못 될 염려가 있습니다.

옵션 2

서투른 것 같습니다. NSTimeInterval에 “subsecond 정확도”가 있다고 말한 애플 문서에도 불구하고 한 번의 테스트에서 날짜를 다시 검색했을 때 48 초가 지났다.

요구 사항

어떤 방법을 선택하든 다음과 같아야합니다.

  1. 1 초 안에 정확합니다.

  2. 읽기 쉽고 신뢰할 수 있습니다.

내 질문

내가 잘못하고 있기 때문에 옵션 2의 부정확성이 있습니까?

이 두 가지 옵션 중 어느 것을 사용 하시겠습니까?

내가 모르는 다른 옵션이 있습니까?

감사!



답변

불필요하게 복잡한 일이 있습니다. 왜 날짜를 시간 간격으로 변환 한 다음 (시간 간격을 다른 프리미티브로 변환)? 그냥 [sharedDefaults setObject:theDate forKey:@"theDateKey"]끝내세요. NSDate는 PLIST 형식 (날짜, 숫자, 문자열, 데이터, 사전 및 배열)이 지원하는 “주요 유형”중 하나이므로 직접 저장할 수 있습니다.

증거 는 설명서 를 참조하십시오 .

날짜를 직접 저장하고 검색하기 만하면 올바른 일을 할 수 있습니다 (시간대, 정밀도 등 포함). 다른 사람들이 말했듯이 포매터는 없습니다.


답변

옵션 # 1의 경우 날짜 포맷터가 포함되어 있다고 생각하지 않습니다. 아마 후드 아래에 있지만 그것이 깨지지 않았다고 생각합니다. 날짜는 ISO 8601 형식으로 저장됩니다 .

옵션 # 2, 사용 -setDouble:forKey:-doubleForKey대신의 float기반 버전. 정밀도 오류의 원인이 될 수 있습니다.


답변

NSUserDefaults를 사용하십시오. 날짜는 Zulu 시간으로 저장되므로 걱정할 시간대 문제가 없습니다. 표준 시간대에 저장하고 다른 표준 시간대에서 꺼내면 괜찮습니다. 시스템에서 변환을 처리합니다 (걱정할 날짜 포맷터 없음).


답변

Facebook Graph API에서 만료 날짜를 저장하는 경우 * 옵션 2 *를 사용 합니다.

옵션 2는 쉽게 stringWithFormat을 사용하여 문자열로 변환 할 수 있습니다. 가장 중요한 것은 Graph API에서 작동합니다.

또한 날짜 형식에 대해 걱정할 필요가 없습니다. NSDateFormatter를 다루지 않으면 48 초 오류의 가능성이 있습니다.


답변