【问题标题】:NSString of comma separated days to NSDate calculate closest day to current dayNSString 的逗号分隔天数到 NSDate 计算最接近当天的日期
【发布时间】:2013-05-16 14:00:12
【问题描述】:

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

        }
    }

【问题讨论】:

  • 您能否通过记录 dayString 对象的值来检查其格式是否正确? NSDateFormatter 有时会做一些奇怪的事情。
  • @Maarten yes dayString 显示今天,即 16,这是正确的

标签: ios json nsstring nsdate nsdateformatter


【解决方案1】:
  1. dayString 不应该是字符串,应该是 NSInteger
  2. 在使用日期遍历数组时,还将所有字符串转换为整数(例如,[currentDayString integerValue]

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

这是问题中给出正确 minIndex 的代码 sn-p

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);

    }
}

【讨论】:

  • 我已经在上面编辑了一些代码,但它似乎没有给我正确的结果?
  • 这个代码是正确的,但是我的 sepDates 数组 = [mayString componentsSeparatedByString:@","];崩溃。我可以记录数组的索引,看看它是否分隔了字符串数组,使用你的数组很好。那是一个 C 数组吗?
  • 不,那是 Objective-C NSArray。您的数组可能包含非整数值。通过 sepDates = [mayString componentsSeparatedByString:@","]; 创建数组后用 NSLog 打印它以验证它是否只有整数。
  • 不用担心,从来没有见过这样声明的数组,所以它把我扔了,所以你的数组是一个整数数组,我的仍然是一个字符串数组,所以我会将它们转换为整数。干杯
  • 我的数组也是一个字符串数组(例如,参见本教程:blog.bignerdranch.com/398-objective-c-literals-part-1)。稍后我将使用 NSString 的 integerValue 方法转换所有字符串值。
【解决方案2】:

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

【讨论】:

  • 我认为我需要在单独的日子里进行迭代,一旦字符串被分开,它们存储的内容以及如何比较以获得结果,我就会更加卡住。
【解决方案3】:

这样做。

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

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

NSMutableIndexSet 是自动排序的。

然后这样做

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

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

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

希望这会有所帮助。干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多