1

次の名前と日付のペアを持つ NSArray があります。注: 日付は常にカスタム配列のインデックス 1 にあります

MyCustomArray: 
(
"Toms Bday"
"2012-01-10"
)
(
"Jesscia Bday"
"2012-01-27"
)
(
"Jills Bday"
"2012-03-03"
)
(
"Joes Bday"
"2012-04-15"
)

私の配列には何百もの名前の日付のペアがあります。したがって、特定の StartDate = "2012-01-01" および endDate = "2012-01-31" の場合、次のレコードだけを取得したいと考えています。それ、どうやったら出来るの?

(
    "Toms Bday"
    "2012-01-10"
    )
    (
    "Jesscia Bday"
    "2012-01-27"
    )

この投稿を調べましたなぜNSDateを<または>を使用して比較できないのですか? しかし、まだそれを理解することはできません。

4

4 に答える 4

3

日付が非常に単純な形式であることを考慮すると、それらを文字列として比較でき、結果は正しいはずです。

NSString *start = @"2012-01-01";
NSString *end = @"2012-01-31";

NSString *date = @"2012-01-10";

if ([start compare:date] == NSOrderedAscending &&
    [end compare:date] == NSOrderedDescending) {
    // Note: might be descending for start and ascending for end, i'm not 100% sure, try both

    // valid date
}
于 2012-12-28T14:56:49.863 に答える
1

entriesあなたNSArrayNSArrays の sと仮定しますNSString

NSDateFormatter * formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd"];

NSString * start = @"2012-01-01";
NSDate * startDate = [formatter dateFromString:start];

NSString * end = @"2012-01-31";
NSDate * endDate = [formatter dateFromString:end];

NSIndexSet * indexes = [entries indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    NSString * dateString = obj[1]; // retrieve the date string
    NSDate * date = [formatter dateFromString:dateString];

    return !([date compare:startDate] == NSOrderedAscending ||
             [date compare:endDate] == NSOrderedDescending);
}];

NSArray * results = [entries objectsAtIndexes:indexes];

ここで行っているのは、ブロックで定義されたテスト (開始日と終了日の間にある) に合格したインデックスをフィルタリングし、それらのインデックスだけで配列を作成することです。

その前に、. を使用して文字列から日付を取得する必要があることは明らかですNSDateFormatter

個人的には、述語よりブロックの方が読みやすいと思うので好きです。

于 2012-12-28T15:26:38.620 に答える
1

データ構造を自分で決定できる場合 (つまり、外部要件ではない場合) は、内部配列 (いわばデータ セットのレコード) を辞書に変換することを検討することをお勧めします。

レコードに辞書を使用する利点は、Cocoa フレームワークが、データの保存、フィルタリング、および一般的な接続に必要なすべてを提供することです。

そこで、次のようなセットアップを提案させてください。

// For the purposes of this piece of code, a hard coded array of dictionaries: 
NSArray *fullArray = @[
    @{@"desc": @"Toms Bday",    @"bday": [NSDate dateWithString:@"2012-01-10 00:00:00 +00:00"]},
    @{@"desc": @"Jesscia Bday", @"bday": [NSDate dateWithString:@"2012-01-27 00:00:00 +00:00"]}
// etc...
];


// The interval of NSDates that you want to filter
NSDate *intervalBeginning = [NSDate dateWithString:@"2012-01-15 00:00:00 +00:00"];
NSDate *intervalEnd       = [NSDate dateWithString:@"2012-01-31 23:59:59 +00:00"];

// Find the relevant record(s):
NSArray *filteredArray = [fullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"bday >= %@  and bday <= %@", intervalBeginning, intervalEnd]];

終わり!

于 2012-12-28T15:20:05.867 に答える
0

私を助けてくれたみんなに感謝します。これが私のKal-Calendarプロジェクトで現在機能しているコードです。これが将来興味のある人に役立つことを願っています。この投稿に答えた他の人々はより良​​い一般的な答えを持っていましたが

- (void)loadHolidaysFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate
{
    NSLog(@"Fetching B-Days between %@ and %@...", fromDate, toDate);

    NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease];
    [fmt setDateFormat:@"yyyy-MM-dd"];


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"birthdays.plist"];

    //READ IN
    NSMutableArray *arryData = [[NSMutableArray alloc] initWithObjects:nil];
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:stringsPlistPath];



    for (id key in dictionary) 
    {
        [arryData addObject:[dictionary objectForKey:key]];
    }


    for (int i=0; i<[arryData count]; i++)
    {

        NSMutableArray *bdayArray = [[NSMutableArray alloc] initWithArray:[arryData objectAtIndex:i]];

        NSString *nameStr = [bdayArray objectAtIndex:0];
        NSString *bdayStr = [bdayArray objectAtIndex:1];

        NSLog(@"nameStr:%@ ... bdayStr:%@ ...", nameStr,bdayStr);


        NSDate *BirthdayDate = [fmt dateFromString:bdayStr];

        if ([fromDate compare:BirthdayDate] == NSOrderedAscending &&
            [toDate compare:BirthdayDate] == NSOrderedDescending) 
        {
            // valid date
            //do something interesting here ... and it does!
        }

    }
于 2012-12-28T15:42:15.380 に答える