NSCalendarUnitSecond返回零

时间:2014-11-25 10:04:45

标签: ios objective-c xcode nsdate nscalendar

我有这个方法返回一个字符串。但秒值始终为零。我做错了什么?

-(NSString*)secondsBetweenDate:(NSDate*)startDate andDate:(NSDate*)endDate {

    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned int unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

    NSDateComponents *difference = [calendar components:unitFlags fromDate:startDate  toDate:endDate  options:0];

    long hour = [difference hour];
    long min = [difference minute];
    long sec = [difference second];
    NSLog(@"Hour: %ld Min: %ld Sec: %ld", hour, min, sec);
    return [NSString stringWithFormat:@"%02ld:%02ld:%02ld", hour, min, sec];
}

2 个答案:

答案 0 :(得分:0)

为什么不使用默认的NSDate差异计算? 返回NSTimeInterval,以秒为单位:

  

typedef double NSTimeInterval;描述用于指定时间   间隔,以秒为单位。

操作是:

[aDate timeIntervalSinceDate:anotherDate];

答案 1 :(得分:0)

您的代码是正确的。如果您使用其秒值实际不同的日期,则会产生预期结果。

[self secondsBetweenDate:[NSDate dateWithTimeIntervalSinceNow:-99999] andDate:[NSDate date]];

日志:

Hour: 27 Min: 46 Sec: 39

99999秒是27 * 60 * 60 + 46 * 60 +39


在我们的评论讨论中,我们发现你有更多的概念问题。如果您需要显示倒计时或秒表类型字符串,则必须使用当前时间作为日期参数之一。

因此,如果您想显示自特定日期(如秒表)后经过的时间,请使用:

NSDate *now = [NSDate date];
string = [self secondsBetweenDate:yourStartDate andDate:now];

如果您想显示特定日期(如倒计时)之前的时间,请使用:

NSDate *now = [NSDate date];
string = [self secondsBetweenDate:now andDate:yourEndDate];

顺便说一句:如果您只是针对iOS 8及更高版本,则可以使用NSDateComponentsFormatter格式化日期

NSDateComponentsFormatter *df = [[NSDateComponentsFormatter alloc] init];
df.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
df.allowedUnits =  NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSString *dateString = [df stringFromDate:startDate toDate:[NSDate date]];