あなたはdateFormatでHH
およびを使用しています。は「24 時間形式の時間」を意味し、ピリオド (つまり PM)よりも優先されるように見えます。a
HH
a
文字列を NSDate に変換するには、「12 時間形式の時間」を意味する@"MMM dd, yyyy hh:mm a"
とともに使用します。hh
NSString *_dateToFormat = @"Jul 17, 2013 09:10 PM"; // this is in local time zone! (mine is UTC+2)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSLog(@"wrong _date: %@", _date);
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
_date = [formatter dateFromString:_dateToFormat];
NSLog(@"correct _date: %@", _date); // this is in UTC, not in local time zone!
NSLog(@"correct _date: %@", [_date descriptionWithLocale:[NSLocale currentLocale]]); // this should be in your local timezone
出力:
wrong _date: 2013-07-17 10:10:00 +0000
correct _date: 2013-07-17 19:10:00 +0000 (in my timezone: 21:10, or 09:10 PM)
correct _date: Wednesday, July 17, 2013, 9:10:00 PM Central European Summer Time
通常、NSDate を印刷すると UTC で印刷されることに注意してください。したがって、タイムゾーンが異なる場合、ログに記録された NSDate は入力日付と一致しません。タイムゾーンと UTC の間のオフセットによってずれます。
印刷[_date descriptionWithLocale:[NSLocale currentLocale]]
して、ローカル タイムゾーンの時刻を確認できます。
しかし、これはNSDateをNSLogするときだけです。NSDate はまだ正しいです。印刷された出力が間違っているようです。
結論として、コードは次のようになります。
NSString *_dateToFormat = @"Jul 17, 2013 09:10 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setDateFormat:@"MMM dd, yyyy hh:mm a"];
// create date from string
NSDate *_date = [formatter dateFromString:_dateToFormat];
// subtract 45 minutes
_date = [_date dateByAddingTimeInterval:-60*45];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
// turn date into string
NSString *_newDate = [formatter stringFromDate:_date];
NSLog(@"%@", _newDate);
出力:2013-07-17 20:25