【问题标题】:Comparing times between multiple dates in NSMutableArray NSDateComponent only returns the value of the first date在 NSMutableArray NSDateComponent 中比较多个日期之间的时间只返回第一个日期的值
【发布时间】:2014-05-31 17:54:52
【问题描述】:

基本上,我有一个可以包含多个 NSManagedObjects 的数组,我正在尝试对这些对象进行排序,对于那些有开始日期的对象,我想比较开始日期和现在或开始日期和结束之间的时间如果设置了日期。最后设置一个计时器以在一秒钟内刷新此信息。

我遇到的问题是比较时间时只返回第一个对象的值和开始日期。如果我使用开始日期添加另一个值,则时间设置为 0,并在我希望将它们添加在一起时重新开始。

如果您需要更多信息,请告诉我

我之前使用过 for(object *obj in Array),但它似乎有更多问题

int time = 0;
if([_ttimes count] != 0){

    for(int i=0; i < [_ttimes count]; ++i){
        TTime *tTime = [_ttimes objectAtIndex:i];
        NSLog(@"time%i", i);
        if(tTime.sDate){
            NSCalendar *cal = [NSCalendar currentCalendar];
            NSDate *date = [NSDate date];
            if(tTime.eDate){
                date = tTime.eDate;
            }
            NSDateComponents *component = [cal components:NSSecondCalendarUnit fromDate:tTime.sDate toDate:date options:0];
            int tmpTime = [component second];
            time = time + tmpTime;
        }
    }
    _ticketTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(TotalWorkTime) userInfo:nil repeats:NO];
}

把方法改成这样:

-(void)TotalWorkTime{ double time = 0; if([_ttimes count] != 0){ for(TTime *tTime in _ttimes){ NSDate *date = [NSDate date]; if(tTime.eDate){ date = tTime.eDate; } NSTimeInterval timerint = -[tTime.sDate timeIntervalSinceDate:date]; time = time + timerint; } NSLog(@"Time:%f", time); } }

这似乎返回了一个更准确的时间,但是谢谢 Zaph,但这仍然不能解决 time += timerint 无法正常工作的问题,每次我添加一个新对象时这个数字都会重置,它也只返回值最后添加的对象。

【问题讨论】:

  • 你是对的,快速枚举不能用于用户创建的类,除非添加快速枚举支持,这通常很容易添加。
  • 好的,我试试看
  • 虽然这比设置日历要干净得多,但它会返回一个负值(问题不大),但它仍然不允许我添加对象时间
  • 查看我添加的答案。

标签: ios objective-c date nsmutablearray


【解决方案1】:

NSDateComponentscomponents:NSSecondCalendarUnit 的问题在于它只返回 0-59。 (有极少数例外)

此外,由于您每秒都会触发一个计时器,因此第二个 (0-59) 很有可能是相同的。要在if(tTime.sDate) 之后检查此添加日志记录:

NSLog(@"tTime.sDate: %@", tTime.sDate);

看看日期是否真的相同,只是秒数相同。

而不是这个:

NSDateComponents *component = [cal components:NSSecondCalendarUnit fromDate:tTime.sDate toDate:date options:0];
int tmpTime = [component second];
time = time + tmpTime;

试试这个:

NSTimeInterval tmpTime = -[tTime.sDate timeIntervalSinceDate:date];
time += tmpTime;

【讨论】:

  • += 似乎与 time = time + tmpTime 的行为相同,但仍然没有在数组中添加单独对象的值
  • 是的,找一本关于“C”编程语言的好书。你NSLog(0 的实际日期,用调试器跟踪执行了吗?
  • Zaph 谢谢你,我有几本 C 编程书籍 2 用于 C++,我刚买了第三版或第四版的大书呆子牧场,但我发现这与我犯的错误信息无关使用 addObject: 而不是 insertObject: atIndex: 这一切都搞砸了,谢谢你的病人,并且使用时间间隔方法来获取时间是比其他方法更好,还是取决于日期之间的距离。还是只是出于偏好
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2012-12-29
相关资源
最近更新 更多