在一个plist中,我有几个字典(事件,例如足球比赛),如下所示:
<dict>
<key>date</key>
<date>2011-11-24T00:00:00Z</date>
<key>title</key>
<string>Amsterdam - Roosendaal</string>
</dict>
<dict>
<key>date</key>
<date>2012-06-25T00:00:00Z</date>
<key>title</key>
<string>Rotterdam - Utrecht</string>
</dict>
我有一个tableview,其中有一些名为'Today'和'Tomorrow'的部分。现在,无论何时发生今天的事件,我都希望在“今天”部分看到它,明天的活动计划在“明天”。
编辑:我现在有了这段代码:self.Array = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"matches" ofType:@"plist"]];
for (int i=0; i<[Array count]; i++) {
NSDate *datum = [[Array objectAtIndex:i] objectForKey:@"datum"];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components: (NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:datum];
NSDate *otherDate = [cal dateFromComponents:components];
if([today isEqualToDate:otherDate]) {
//do stuff
NSLog(@"%i, %@", i, otherDate);
NSLog(@"Match is today");
}
else {
NSLog(@"Match is not today");
}
从NSLog看来,它以正确的方式进行比较。然而,我现在想要在一个部分中显示那些具有今天日期的字典。我想因此我必须创建一个它们的数组(可能通过添加'// do stuff'区域中的东西,比如addObject?)有什么想法吗?
答案 0 :(得分:0)
首先,不要与字符串进行比较,将数据保存在其中NSDate。
然后尝试
if ( [myDate timeIntervalSinceDate:dateOfEvent] < 86400 ) { // less than a day apart.
}
(使用[myDate isEqualToDate:dateOfEvent]进行精确比较(到第二次),所以不要使用它。
你必须对此进行微调以确定&#34; day&#34;实际上,你需要找到日期界限,但这不应该太难。
如果要向用户显示日期,请使用NSDateFormatter。
您还可以使用NSDateFormatter将这些转换为仅日期(无时间戳),然后比较这些字符串,以便您比较2011/16/11到2011/15/11。 像这样:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setTimeStyle:NSDateFormatterNoStyle];
NSDate *today = [NSDate date];
NSDate *tomorrow = [today dateByAddingTimeInterval:86400];
NSString *eventDateString = @"2011-11-24T00:00:00Z"; // get your date string from the array
[df setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; // this matches your dictionary's format
NSDate *eventDate = [df dateFromString:eventDateString];
// now you have 3 dates. convert them to timeless strings using another date formatter.
NSDateFormatter *timeless = [[NSDateFormatter alloc] init];
[timeless setTimeStyle:NSDateFormatterNoStyle];
[timeless setDateStyle:NSDateFormatterMediumStyle];
NSString *todayString = [timeless stringFromDate:today];
NSString *tomorrowString = [timeless stringFromDate:tomorrow];
eventDateString = [timeless stringFromDate:eventDate];
if ( [todayString isEqualToString:eventDateString ] ) {
NSLog(@" today %@ == event: %@", todayString, eventDateString);
} else if ( [tomorrowString isEqualToString:eventDateString] ) {
NSLog(@" tomorrow %@ == event: %@", tomorrowString, eventDateString);
}
[df release];
[timeless release];
答案 1 :(得分:0)
您还应该查看NSCalendar和NSDateComponents。您可以使用它们将日期(或日期+月份+年份或某个时代的绝对日期)作为日期所在的整数来获取。这样,您可以在同一天,沿着日历日的边界进行两次比较。 (它还会考虑到夏令时和其他奇怪的事情)。
您也可以使用它们将当前日期([NSDate日期])转换为当天开始的日期。例如,在课程的苹果文档中。
[edit]你有了这个部分(听起来像你这样做),然后你说你想把它显示在一个带有部分的表中。基本上在相同/天的测试之后想要建立一个二维数组(更具体地说,一个NSArray有2个对象,它们本身就是NSMutableArrays)。您添加了今天对象的NSMutableArrays之一,另一个是将明天对象添加到。
完成后,您可以填写tableview委托和数据源方法来填充表。 (例如,节的数量将是外部数组的计数,每个单元格的索引路径将对应于外部数组(节)和内部可变数组(行)。)使用TableView编程指南获取更多详细信息。