0

我有一个像这样的字符串 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);

        }
    }
4

3 回答 3

1
  1. dayString 不应该是字符串,它应该是 NSInteger
  2. 在使用日期迭代数组时,还将所有字符串转换为整数(例如,[currentDayString integerValue]

搜索最近一天的实际算法将遍历您的初始数组并找到数组中的值与当前日期之间的差异的绝对值。将这些差异存储在单独的数组中。在第二个数组中找到最小值。最小差异的位置(索引)将与第一个数组中最近日期的位置相同。

这是给出正确 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);

    }
}
于 2013-05-16T14:08:07.530 回答
0

做这个。

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

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

NSMutableIndexSet 是自动排序的。

然后这样做

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

这将为您提供最接近的下一个日期。

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

希望这可以帮助。干杯。

于 2013-05-16T14:18:59.783 回答
0

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

于 2013-05-16T14:05:45.620 回答