今天和明天两个日期之间的日期组件日差异错误

时间:2014-06-07 18:54:33

标签: ios cocoa-touch date time nsdatecomponents

如果截止日期实际上是今天或明天,我想在标签中显示“今天”或“明天”,并以“dd-mm-yyy”格式显示其余部分。

除了(鉴于今天是6月7日)这一事实外,一切都有效:

  • 如果我将截止日期设置为今天(6月7日)或明天(6月8日),则标签将更新为“今天”文本。
  • 如果我将截止日期设定为后天(6月9日),则会显示“明天”。

这是我的代码:

- (void)configureDueLabelForCell:(UITableViewCell *)cell withChecklistItem:(ChecklistItem *)item
{
    UILabel *label = (UILabel *)[cell viewWithTag:1002];

    if (item.shouldRemind) {
        int difference = [self dateDiffrenceToDate:item.dueDate];
        if (difference == 0) {
            label.text = @"Today";
        } else if (difference == 1) {
            label.text = @"Tomorrow";
        } else {
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
           // [formatter setDateStyle:NSDateFormatterMediumStyle];
            [formatter setDateFormat:@"dd-MM-yyyy"];
            label.text = [formatter stringFromDate:item.dueDate];
        }

    } else {
        label.text = @"";
    }
}

-(int)dateDiffrenceToDate:(NSDate *)dueDate
{
    // Manage Date Formation same for both dates
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy"];
    NSDate *startDate = [NSDate date];
    NSDate *endDate = dueDate;


    unsigned flags = NSDayCalendarUnit;
    NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];

    int dayDiff = [difference day];

    return dayDiff;
}

我也尝试过:

//    NSDate *startDate = [NSDate date];
//    NSDate *endDate = dueDate;
//    
//    NSTimeInterval secondsBetween = [endDate timeIntervalSinceDate:startDate];
//    
//    int numberOfDays = secondsBetween / 86400;
//    NSLog(@"numberofdays: %d", numberOfDays);
//
//    return numberOfDays;

1 个答案:

答案 0 :(得分:3)

来自https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

“...此方法将计算结果截断为提供的最小单位。例如,如果fromDate:参数对应于2010年1月14日晚上11:30,而toDate:参数对应于1月15日, 2010年上午8:00,两个日期之间只有8.5小时。如果你要求天数,你会得到0,因为8.5小时不到1天。可能会有这样的情况,这应该是1天。您必须决定用户在特定情况下期望的行为。如果您确实需要计算返回天数,通过两个日期之间的中间夜数计算,您可以使用类似于NSCalendar的类别。清单13中的一个。“