【问题标题】:24 hours divided by 30 minutes apart - NSDate24 小时除以 30 分钟 - NSDate
【发布时间】:2014-04-18 08:20:12
【问题描述】:

我正在尝试从现在开始的接下来的 24 小时内获取 NSDates 中的 NSDates 每个 NSDate 对象中最接近的四舍五入 HH:00 或 HH:30。

让我们说现在是 02:31 我想要输出 @[03:00,03:30,04:00,04:30...03:00(第二天)]

如果它是 02:29,那么我想要 @[02:30,03:00 等等,直到第二天 02:30]。

现在我有下面的代码,它几乎一直都在工作,但我很少得到我想要的所有 NSDate 对象的输出,并且需要额外的一分钟(@[03:01,03: 31:04:01...等等])。

有什么想法吗?

-(NSMutableArray*)TwentyFourHoursFromNowDivicedBy30Mins
{

    NSMutableArray * dateArray = [NSMutableArray array];
    NSCalendar * cal = [NSCalendar currentCalendar];

    NSDateComponents * plusDays = [NSDateComponents new];
    NSDate * now = [self changeTimeValue:[NSDate date]];

    for( NSUInteger day = 0; day < 2; day++ )
    {
        [plusDays setDay:day];
        [dateArray addObject:[cal dateByAddingComponents:plusDays toDate:now options:0]];
    }

    NSDate *startDate = [dateArray objectAtIndex:0];
    NSDate *endDate = [dateArray objectAtIndex:1];
    NSDateComponents *diff = [[NSDateComponents alloc] init];
    [diff setMinute:0];
    NSCalendar *calz = [NSCalendar currentCalendar];
    NSDate *tmp = startDate;

    NSMutableArray *dates = [NSMutableArray arrayWithObject:tmp];

    while ([tmp laterDate:endDate] == endDate) {
        [diff setMinute:[diff minute] + 30];
        tmp = [calz dateByAddingComponents:diff toDate:startDate options:0];
        [dates addObject:tmp];

    }


    return dates;

}
- (NSDate *)changeTimeValue:(NSDate *)dateValue{
    NSDateComponents *time = [[NSCalendar currentCalendar]
                              components:NSHourCalendarUnit | NSMinuteCalendarUnit
                              fromDate:dateValue];
    long val = 0;
    NSDate *newDate = [[NSDate alloc] init];
    NSInteger minutes = [time minute];
    if(minutes > 0 && minutes < 30) {
        val = 30 - minutes; NSTimeInterval aTimeInterval = [dateValue
                                                            timeIntervalSinceReferenceDate] + 60 * val + minutes;
        newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
        return newDate;
    } else if(minutes > 30 && minutes < 60) {
        val = 60 - minutes;
        NSTimeInterval aTimeInterval = [dateValue timeIntervalSinceReferenceDate]
        + 60 * val;
        newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
        return newDate;
    } else {
        return newDate;
    }
}

【问题讨论】:

    标签: objective-c nsmutablearray nsdate nscalendar nsdatecomponents


    【解决方案1】:

    您没有将changeTimeValue 中的秒数归零,而且无论如何我认为您将其复杂化了。所以我怀疑你随后会看到四舍五入的问题。只需使用NSDateComponents 即可完成整个工作:

    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    
    NSDateComponents *dateComponents = [currentCalendar
                                  components:NSHourCalendarUnit | 
                                             NSMinuteCalendarUnit | 
                                             NSYearCalendarUnit |
                                             NSMonthCalendarUnit |
                                             NSDayCalendarUnit
                                  fromDate:dateValue];
    
    dateComponents.minute += 15;
    dateComponents.minute -= dateComponents.minute%30;
    
    return [currentCalendar dateFromComponents:dateComponents];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 2023-04-07
      • 2016-05-05
      • 2015-08-21
      相关资源
      最近更新 更多