NSDateFormatterの挙動でちょっとはまったのでメモ。
日時をNSStringからNSDateに変換する方法です。
NSDateFormatter
NSString時間をNSDateに変換するために、ここではNSDateFormatterを使います。
例は後述しますが 注意が必要なのはタイムゾーンの指定 の箇所です。
タイムゾーンにはGMTからの経過時間をセットします。
GMTとはグリニッジ標準時のことで、世界のどこでも共通の時間になります。
NSDateFormatterでNSStringをNSDateに変換する際、タイムゾーンを指定しないと自動でローカル時間からGMTへの変換処理が入ってから出力されます。
つまり、 ローカル時間の設定(設定>一般>日付と時刻で設定)によって出力結果が変わってしまう ので、タイムゾーンは指定するようにしましょう。
ちなみにNSDateをNSStringに変換すると自動でローカル時間に変換してくれちゃうので、その逆ということなんですかね。
そのままの時間でNSDateにしたい場合
タイムゾーン指定でGMTからの経過時間に0をセットしてあげると、NSStringで記載した日時そのままでNSDateに変換できます。
NSString* dateString = @"2014-09-14 15:45:00";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//タイムゾーンの指定
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@",date);
出力結果 date: 2014-09-14 15:45:00
GMTなNSDateにしたい場合
NSStringをGMTなNSDateにしたい場合は、タイムゾーン指定の箇所にGMTからの経過時間をきちんとセットしてあげる必要があります。
例えばNSStringが日本時間の場合は、9時間をセットしてあげます。
NSString* dateString = @"2014-09-14 15:45:00";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//タイムゾーンの指定
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:60 * 60 * 9]];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@",date);
出力結果 date: 2014-09-14 06:45:00
おわりに
ローカル時間の設定がどこになっていてもGMTは同じになるので、ある特定の時間と現在時刻を比較をする場合など、それぞれGMTに変換してあげると何かと便利だったりします。
ちなみにGMT/ローカル現在時刻は以下で一発で取得できますヨ!
//GMT現在時刻
NSDate* gmtNow = [NSDate date];
//ローカル現在時刻
NSDate* localNow = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone systemTimeZone] secondsFromGMT]];