[[NSDate date] dateByAddingTimeInterval:60 * 60] is a really common attempt to get the current time in, let’s say, France. Despite developer’s expectations, it does not represent current time in GMT+1 time zone. So where is all the confusion coming from?
po [NSDate date] in Xcode console. What are we seeing?
2014-03-17 20:53:28 +0000. Quick look in Xcode doesn’t make it clearer:
NSDate *date = [NSDate date]; is presented as
2014-03-17 22:53:28 IST (It shows the date as it appears in the developer’s time zone). I believe, this is what trips people up.
In MVC sense of things, you have an
NSDate object representing a model. It is agnostic to the concept of time zone or particular localization. Then, you have a group of APIs dealing with displaying or parsing dates and performing calculations on them:
NSDateFormetter etc. Those are your “views”.
Just as you wouldn’t store view in your database, don’t store or pass around serialized dates, use NSDate instead – in the end of the day that’s why it exists, to provide a good abstraction of a unix timestamp, decoupled from the way you present it to the user.
To summarize, as soon as you received a date from web API, parse it to
NSDate. Or, if API utilizes unix timestamps, use
[NSDate dateWithTimeIntervalSince1970:], just keep in mind that it expects seconds. Just before presentation to the user, render the date object into the human readable (meaning localized, time zone aware) string.
Apple documentation is a great place to start
WWDC sessions if you have enough time: