NSDate dateWithTimeIntervalSince1970添加额外的一天

时间:2016-05-03 16:56:28

标签: ios objective-c nsdate


我有一种方法可以更新标签并充当秒表。当我将字符串格式化为因子天数时,它可以正常接受。

例如。如果十分钟前启动秒表,标签将显示:
01:00:10:00
它应该只显示

00:00:10:00

    - (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSDate *dateValue=[[NSUserDefaults standardUserDefaults] objectForKey:@"pickStart"];

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:dateValue];

    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

    // Create a date formatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd:HH:mm:ss"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    // Format the elapsed time and set it to the label
    NSString *timeString = [dateFormatter stringFromDate:timerDate];
    self.stopWatchLabel.text = timeString;

}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

你在做什么是不合适的。您的目标似乎是将timeInterval转换为天,小时,分钟和秒。您使用timerDateNSDateFormatter并不是实现该目标的正确方法。

timeInterval不是1970年1月1日的偏移,而timeInterval并不表示日期。

您应该做的是将currentDatedateValue之间的差异作为一组NSDateComponents

- (void)updateTimer {
    NSDate *currentDate = [NSDate date];
    NSDate *dateValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"pickStart"];

    unsigned int unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:dateValue  toDate:currentDate  options:0];
    int days = [comps day];
    int hours = [comps hours];
    int minutes = [comps minutes];
    int seconds = [comps seconds];

    NSString *timeString = [NSString stringWithFormat:@"%d:%02d:%02d:%02d", days, hours, minutes, seconds];
    self.stopWatchLabel.text = timeString;
}

答案 1 :(得分:0)

没有“额外的一天”,你制作的“日期”是1970年1月1日之后的某个时间点,所以如果你的格式包含你得到的那一天至少1 ...

只需坚持使用NSTimeInterval值并使用NSDateComponentsFormatter - 它也可以格式化时间间隔,不管名称是什么 - 或者只是自己动手来获取秒数,分钟数等格式。< / p>

HTH