What's the optimum way of storing an NSDate in NSUserDefaults?
cocoa, datetime, nsdate, nstimeinterval, nsuserdefaults
Solution
You are needlessly complicating things. Why are you converting the date to a time interval (then the time interval to a different primitive)? Just `[sharedDefaults setObject:theDate forKey:@"theDateKey"]` and be done with it. NSDate is one of the "main types" supported by the PLIST format (dates, numbers, strings, data, dictionaries, and arrays), so you can just store it directly.
See the documentation for proof.
Just store and retrieve the date directly and watch it Do The Right Thing (including time zones, precision, etc). There is no formatter involved, as others have said.
Problem
There's two ways of storing an NSDate in NSUserDefaults that I've come across. Option 1 - setObject:forKey: ``` // Set NSDate *myDate = [NSDate date]; [[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"]; // Get NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"]; ``` Option 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]; ``` Pros and Cons Option 1 This seems to be compact and logical. However, I've got worries about this going wrong because of Date Formatter bugs. Option 2 This seems to be clumsy. I'm also unsure of the accuracy of it - in one test I did, when I retrieved the date back it was out by 48 seconds, despite the Apple Docs saying that NSTimeInterval has "subsecond accuracy". Requirements Whatever method I choose, it must be: Precise to within a second. Readable and reliable. My Question Is the inaccuracy with Option 2 because I'm doing something wrong? Which out of these two options would you use? Is there another option that I'm not aware of? Thanks!