Все NSDates являются абсолютными временами, что означает, что 3:00 AM по центральному времени в Соединенных Штатах Америки - 9:00 UTC. Я подозреваю, что ваш systemTimeZone является центральным временем в Соединенных Штатах.
NSLog всегда показывает время в UTC.
Если вы хотите видеть в виде строки, какое время находится в вашем часовом поясе, вы можете использовать тот же форматер даты stringFromDate: метод и установить для этого часового пояса форматера даты этот часовой пояс .
Форматирование даты NSLog раздражает, потому что приводит к путанице, которую вы испытываете.