我有这样的一系列时间:
(
"2000-01-01 23:48:00 +0000",
"2000-01-01 02:15:00 +0000",
"2000-01-01 04:39:00 +0000",
"2000-01-01 17:23:00 +0000",
"2000-01-01 13:02:00 +0000",
"2000-01-01 21:25:00 +0000"
)
从此代码生成的内容:
//loop through array and convert the string times to NSDates
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat:@"hh:mm a"];
NSMutableArray *arrayOfDatesAsDates = [NSMutableArray array];
for (NSObject* o in arrayTimes)
{
NSLog(@"%@",o);
NSDate *nsDateTime = [timeFormatter dateFromString:o];
[arrayOfDatesAsDates addObject:nsDateTime];
}
NSLog(@"times array: %@", arrayOfDatesAsDates);//
我这样做是因为我想在接下来的数组中获得时间。我的计划是删除过去的时间,订购它们,然后在下次使用第一个。
如何删除过去的?
谢谢
答案 0 :(得分:5)
这样的事情会......
NSArray *dateArray = ...
NSArray *filteredArray = [dateArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSDate *date, NSDictionary *bind){
NSComparisonResult result = [[NSDate date] compare:date];
return result == NSOrderedAscending;
}]];
filteredArray将是dateArray中现在或将来的所有日期。
答案 1 :(得分:0)
如果您在问题中的表示是正确的,那么您的时间实际上是具有类似ISO的日期格式的字符串。
理论上这很糟糕 - 时间戳应该保持为NSDate
s,因为你也暗示自己。
然而(如果您确定没有人在观看),您可以利用ISO日期格式允许字典排序这一事实。字符串“2000-01-01 21:48:00 +0000”在“2000-01-01 23:48:00 +0000”之前排序,因此您所要做的就是使用表示“now”的字符串进行过滤。
NSArray *times = @[
// ... more times
@"2000-01-01 13:02:00 +0000",
@"2014-01-01 13:02:00 +0000",
@"2015-01-01 13:02:00 +0000"
];
NSString *nowString = [[NSDate date] descriptionWithLocale: nil];
NSPredicate *stringPred = [NSPredicate predicateWithFormat: @"SELF >= %@", nowString];
NSArray *filteredTimes = [times filteredArrayUsingPredicate: stringPred];
它 有点hacky,所以记得好评。您可能还需要进行一些防御性测试,以确保您的时间戳格式在将来保持不变。请注意,如果它滑到“2015-2-3 13:02:00 +0000”(在月和日字段中没有前导零),它将会中断,如“2015-10-15 13:02:00” +0000“将在此之前排序。
实际上,您应该在读取数据后立即将时间戳转换为NSDate对象,在这种情况下谓词保持不变,并且您只是直接传递[NSDate date]而不是其字符串表示。
答案 2 :(得分:0)
只需将它们转换为NSDate对象,然后使用compare对数组进行排序: