Time created using initWithFireDate should be added to the run loop, for example
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
Use scheduledTimerWithTimeInterval to create a timer that is automatically assigned in the current run loop.
PS: the description method NSDate always uses GMT, which probably explains your conclusion.
source share