NSDateはGMTで日時を管理していて、タイムゾーンが考慮される年月日時分秒を得るメソッドは存在しません。これらを得たい場合はNSCalendarを使います。

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = 
  [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|
                       NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit
              fromDate:date];
// comps.year,month,hour,minute,secondで、それぞれ取得できる

NSCalendarで得た数値を以下のように連結して表示するのは、国際対応を考えると望ましくありません。国によって年月日の表示順や言語も異なるからです。

NSString *dateTimeString = 
  [NSString stringWithFormat:@"%d年%d月%d日 %d時%d分%d秒", 
   comps.year, comps.month, comps.day, 
   comps.hour, comps.minute, comps.second];

日時の表示をしたい場合は、NSDateFormatterを使いましょう。以下の記事を参考にして下さい。

日時表示を多言語対応する

NSCalendarを使うケースは、

  • 午前3時に何かの処理を実行したい
  • カレンダーアプリを作りたい
  • 世界時計を作りたい

といった時が考えられます。それよりよくあるケースは日時表示だと思いますので、NSCalendarよりNSDateFormatterのほうが出番が多いと思います。

NSCalendarとNSDateComponentsを毎回使うのは面倒なので、ついついNSDateにgetYear,getMonthといったカテゴリメソッドを追加したくなりますが、あまり良いことでは無さそうです。どちらかというとNSCalendarにカテゴリメソッドを追加した方が良いかもしれません。