1

我一直在开发一个集成了秒表的应用程序。我让秒表工作并正确显示秒/分钟等。

但我的问题是,我想在任务完成后显示完整时间(您在 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

4 回答 4

2

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

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

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

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];
于 2013-02-15T15:44:07.170 回答
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];
于 2013-02-15T15:38:25.070 回答
0

答案在于问题所在的文档

d 1..2 1 日期 - 日期 D 1..3 345 日期

在您的情况下,您计算的间隔具有正确的秒数,但这一天是一年中的第一天。

如果您按如下方式修改代码以包含月份,您还将获得 1(对于 1 月)。

[dateFormatter setDateFormat:@"D' Days, 'M' Months, 'H' Hours, 'm' Minutes and 's' Seconds'"];
于 2013-02-15T16:03:40.503 回答
0

你听说过日期时间加法..吗?在我所做的一种情况下,这曾经导致问题。因此,我建议您在必须添加或减去日期时始终使用 NSDateComponents。这是正确的方法..请尝试一下,看看它是否有效..

于 2013-02-15T15:55:17.383 回答