hachinoBlog

hachinobuのエンジニアライフ

NSDateで取得したGMT時間のままNSStringに変換する方法

背景

NSDateのdateメソッドで時刻を取得すると日本時間とは9時間差のGMT時間が返されることは知っていたのだがNSDateFormatterで取得した時間をNSString型に変換したらGMT時間でなく現地時間に変換されてしまっていたので調べた。

現象

NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString* dateString = [formatter stringFromDate:now];
NSLog(@"now:%@", now); //now:2014-04-04 11:16:16 +0000
NSLog(@"dateString:%@", dateString); //dateString:2014-04-04 20:16:16

GMT時間のままNSStringに変換されない。

解決方法

NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSString* dateString = [formatter stringFromDate:now];
NSLog(@"now:%@", now); //2014-04-04 11:22:48 +0000
NSLog(@"dateString:%@", dateString); //dateString:2014-04-04 11:22:48

このようにNSDateFormatterにタイムゾーンを設定してやることでGMT時間でNSStringに変換できる。 タイムゾーンはNSTimeZoneクラスのtimeZoneForSecondsFromGMTというGMT時間からの経過秒数を引数にもつメソッドに0を指定したタイムゾーンをセットしてあげる。