我一直致力于将秒表集成到一个应用程序中。我让秒表工作,正确显示秒/分钟等等。
但我的问题是,我想显示任务完成的全部时间(你在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];
答案 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'"];