以逗号分隔天数的NSString到NSDate计算最近一天到当天

时间:2013-05-16 14:00:12

标签: ios json nsstring nsdate nsdateformatter

我有一个类似于13,27,29的字符串,表示我希望将它们分成日期对象的月份中的几天

mayString = [mayString componentsSeparatedByString:@","];

然后我希望能够计算出这些天中的哪一天,即13或27或29最接近今天的日期,显然上述日期将是27,作为当前日期的下一个最接近的日期。

我可以使用下面的方法来获取当天,但实际上仍然坚持如何获得这样做的逻辑?

//Grab current day from sys date
NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
[dayFormatter setDateFormat:@"dd"];
NSString *dayString = [dayFormatter stringFromDate:[NSDate date]];

我有一个部分完成的解决方案,但它似乎没有给我正确的数组中的索引最接近当天的结果(sepDates是一个数组)

sepDates = [mayString componentsSeparatedByString:@","];

//Day string is todays date i.e 16 (16th)
    NSDate *dayFromString = [dayFormatter dateFromString:dayString];
    NSLog(@"Day from string %@", dayFromString);

    double min = [dayFromString timeIntervalSinceDate:[sepDates objectAtIndex:0]];
    NSLog(@"Min %f", min);

//I then want to calculate which of the dates in the sepDates array at index is closest to todays current day 16

    int minIndex = 0;
    for (int d = 1; d < [sepDates count]; ++d)
    {
        double currentmin = [dayFromString timeIntervalSinceDate:[sepDates objectAtIndex:d]];
        if (currentmin < min) {
            min = currentmin;
            minIndex = d;

            NSLog(@"minIndex = %d", minIndex);

        }
    }

3 个答案:

答案 0 :(得分:1)

  1. dayString不应该是字符串,它应该是NSInteger
  2. 在使用日期迭代数组时,也将所有字符串转换为整数(例如,[currentDayString integerValue]
  3. 搜索最近一天的实际算法是迭代您的初始数组,并找到数组和当前值之间的差异。将这些差异存储在单独的数组中在第二个数组中找到最小值。最小差异的位置(索引)将与第一个数组中最近一天的位置相同。

    以下是问题中提供正确minIndex

    的代码段
    NSArray *sepDates = @[@"13", @"15", @"27", @"29"];
    
    NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
    [dayFormatter setDateFormat:@"dd"];
    NSString *dayString = [dayFormatter stringFromDate:[NSDate date]];
    
    NSDate *dayFromString = [dayFormatter dateFromString:dayString];
    NSLog(@"Day from string %@", dayFromString);
    
    
    NSInteger min = [[sepDates lastObject] integerValue]; //or set it to some large int
    NSLog(@"Min %d", min);
    int minIndex = 0;
    for (int d = 1; d < [sepDates count]; ++d)
    {
        NSInteger currentmin = [sepDates[d] integerValue] - [dayString integerValue];
        NSLog(@"Current min: %d", currentmin);
        //currentmin must be positive since you need next closest day
        if (currentmin > 0 && currentmin < min) {
            min = currentmin;
            minIndex = d;
    
            NSLog(@"minIndex = %d", minIndex);
    
        }
    }
    

答案 1 :(得分:0)

迭代您的日期并计算当前目标的时间并存储该日期,如果它小于先前计算的或未计算任何内容(即第一个元素)。结果将给你答案。

答案 2 :(得分:0)

这样做。

分开日期后。将它们转换为int并将它们添加到可变索引集中。

然后,使用日期格式化程序将今天的日期作为字符串格式为“dd”,将今天的日期(日期字符串)转换为int,然后将该日期添加到可变索引集。

NSMutableIndexSet是自动排序的。

然后这样做

NSInteger closestDateAsInt = [indexSet indexGreaterThanIndex:''today's date as int"];

这将给你最近的下一个日期。

一旦你有最接近的日期的int值。使用日期组件将其转换为日期。

希望这会有所帮助。欢呼声。