NSDate增加了一天

时间:2013-02-15 15:34:16

标签: cocoa-touch

我一直致力于将秒表集成到一个应用程序中。我让秒表工作,正确显示秒/分钟等等。

但我的问题是,我想显示任务完成的全部时间(你在1天,2小时,3分钟,4秒等完成了这项任务)

但每当我这样做时,它总是会增加1天(例如它应该是0天,0小时,2分钟和14秒)但它输出1天,0小时,2分14秒。

代码:

startDate = [[NSDate date] retain];
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"D' Days, 'H' Hours, 'm' Minutes and 's' Seconds'"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString = [dateFormatter stringFromDate:timerDate];
overtext2.text = timeString;
[dateFormatter release];

4 个答案:

答案 0 :(得分:2)

看起来你真的在这里滥用NSDate。

您获得“额外”日的原因是您实际上正在打印日期和时间,就好像您的计时器是在1970年1月1日00:00:00开始的。因此,如果你的计时器运行4小时30分钟,timerDate将是04:30:00 1/1/1970。如果您的计时器要运行40天,那么日期将会结束,timerDate将是00:00:00 9/2/1970,您的“天数”值将是9,而不是预期的40。 / p>

您最好手动计算天数,小时数,分钟数,秒数:

NSDate *startDate; // When the timer was started
NSTimeInterval timerValue = [[NSDate date] timeIntervalSinceDate:startDate]; // Time in seconds from startDate to now
NSInteger secs = timerValue % 60;
NSInteger mins = (timerValue % 3600) / 60;
NSInteger hours = (timerValue % 86400) / 3600;
NSInteger days = timerValue / 86400;
NSString *timeString = [NSString stringWithFormat:@"%d days, %d hours, %d minutes and %d seconds.", days, hours, mins, secs];

答案 1 :(得分:0)

NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

这将增加到1970年的秒数,然后您将该时间转换为几天:小时:分钟:秒,这是永远不会发生的。

或者你可以这样做:

NSInteger seconds=timeInterval;//timeInterval float converted to long.
NSInteger secs = seconds% 60;
NSInteger mins = (seconds% 3600) / 60;
NSInteger hours = (seconds% 86400) / 3600;
NSInteger days = seconds/ 86400;
NSString *timeString = [NSString stringWithFormat:@"%d days, %d hours, %d minutes and %d seconds.", days, hours, mins, secs];

答案 2 :(得分:0)

你听说过加时赛日期吗? 这曾经导致我做过的其中一个案件出现问题。因此,当您必须添加或减去日期时,我建议您始终使用NSDateComponents。这是正确的方法..请尝试使用它,看看它是否有效..

答案 3 :(得分:0)

答案在于文档是问题

d 1..2 1日期 - 月中的某天 D 1..3 345一年中的一天

在您的情况下,您计算的间隔时间为秒,但日期是一年中的第一天。

如果您修改代码如下以包含月份,您将获得1(1月份)。

[dateFormatter setDateFormat:@"D' Days, 'M' Months, 'H' Hours, 'm' Minutes and 's' Seconds'"];