将不同的字符串转换为 NSDate - 1 是正确的,第二个是第一个的副本

Converting different strings to NSDate - 1 is correct, the 2nd is a duplicate of the 1st

出于某种原因,这段代码没有正确转换第二个字符串;这是代码:

    NSLog(@"\n\nsearchStartTime: %@  searchEndTime: %@",searchStartTime, searchEndTime);
    [dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm a"];
    startDate = [dateFormatter dateFromString:searchStartTime];
    endDate = [dateFormatter dateFromString:searchEndTime];

    NSLog(@"\n\nstartDate: %@    endDate: %@", startDate, endDate);  

这是 searchStartTimesearchEndTime 的定义和值:

searchStartTime: 2015-03-05 08:30 AM searchEndTime: 2015-03-05 09:30 AM

这是 NSLog 的结果:

startDate: 2015-03-05 08:30:00 +0000 endDate: 2015-03-05 08:30:00 +0000

我这里的代码有什么问题?我想获取这两个 date/time 对象并在 NSPredicate 中使用它们来比较核心数据记录中的日期。

一个错误是 "HH",它是 24 小时制,但您还使用 "a" 作为 & pm。

改为使用 "hh" 表示 12 小时。

示例:

NSString *searchStartTime = @"2015-03-05 08:30 AM";
NSString *searchEndTime = @"2015-03-05 09:30 AM";

NSLog(@"\n\nsearchStartTime: %@  searchEndTime: %@", searchStartTime, searchEndTime);
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat: @"yyyy-MM-dd hh:mm a"];
NSDate *startDate = [dateFormatter dateFromString:searchStartTime];
NSDate *endDate   = [dateFormatter dateFromString:searchEndTime];

NSLog(@"\n\nstartDate: %@ endDate: %@", startDate, endDate);

输出:

searchStartTime: 2015-03-05 08:30 AM searchEndTime: 2015-03-05 09:30 AM
startDate: 2015-03-05 13:30:00 +0000 endDate: 2015-03-05 14:30:00 +0000

参见:ICU Formatting Dates and Times
还有:Date Field SymbolTable.

这一切都归结为了解您的格式代码字符串。您在这里误用了 "HH",所以时间不对。

另一个问题是您没有捕获错误。通过调用 dateFromString:,您将错过了解错误的机会。使用getObjectValue:forString:range:error:学习问题。

无论如何,我在你有 "HH" 的地方替换了 "hh",结果是正确的:

NSString* searchStartTime = @"2015-03-05 08:30 AM";
NSString* searchEndTime = @"2015-03-05 09:30 AM";
NSLog(@"\n\nsearchStartTime: %@  searchEndTime: %@",searchStartTime, searchEndTime);
NSDateFormatter* dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat: @"yyyy-MM-dd hh:mm a"];
NSDate* startDate = [dateFormatter dateFromString:searchStartTime];
NSDate* endDate = [dateFormatter dateFromString:searchEndTime];
NSLog(@"\n\nstartDate: %@    endDate: %@", startDate, endDate);
startDate: 2015-03-05 16:30:00 +0000    endDate: 2015-03-05 17:30:00 +0000

我在加利福尼亚,显示的时间是相对于伦敦的时间,所以如果减去时差,您会发现这是正确的。