您正在使用HH
和a
在您的 dateFormat 中。HH
表示“24 小时格式的小时”,看起来它优先于a
,句点(即 PM)。
使用@"MMM dd, yyyy hh:mm a"
with hh
,这意味着“12 小时格式的小时”将您的字符串转换为 NSDate。
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]]
以查看当地时区的时间。
但这只是当你 NSLog NSDate 时。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