1

日付文字列を含む配列を降順で並べ替えたいのですが、SOの回答を試しましたが、間違った出力が得られます。

以下のように私のコードを見てください:

NSArray *dateArray=[NSArray arrayWithObjects:@"01/12/2012",@"01/26/2011",@"02/09/2005",@"02/24/2006",@"03/19/2007",@"07/14/2011",@"08/17/2007",@"10/04/2007",@"10/31/2006",@"12/05/2012",@"12/06/2006",@"12/23/2008",nil];
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"MM/DD/YYYY"];
NSMutableArray *tempArr=[[NSMutableArray alloc]init];
for (int i=0; i<[dateArray count]; i++) {

    NSString *dt=[dateArray objectAtIndex:i];
    NSDate *newDt=[formatter dateFromString:dt];
    [tempArr addObject:newDt];
}
NSLog(@"tempArr is %@",tempArr);

以下のようなコンソール出力を取得しています。

「 2004-12-18 18:30:00 +0000"、"2005-12-24 18:30:00 +0000"、"2006-12-23 18:30:00 +0000"、"2010-12-18 18:30:00 +0000"、"2006-12-23 18:30:00 +0000"、"2006-12-23 18:30:00 +0000"、"2005-12-24 18:30:00 +0000"、"2011-12-24 18:30:00 +0000"、"2005-12-24 18:30:00 +0000"、"2007-12-22 18:30:00 +0000" )

月の代わりに「12」が来る理由と、指定した形式のように日付形式が来ない理由がわかりません。

4

3 に答える 3

7

まず、実際にはコード内で何もソートしていません...

あなたはこのようなことをするべきです...

// create the string array
NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005", @"02/24/2006", @"03/19/2007", @"07/14/2011", @"08/17/2007", @"10/04/2007", @"10/31/2006", @"12/05/2012", @"12/06/2006", @"12/23/2008"];

// create the date formatter with the correct format
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSMutableArray *tempArray = [NSMutableArray array];

// fast enumeration of the array
for (NSString *dateString in dateArray) {
    NSDate *date = [formatter dateFromString:dateString];
    [tempArray addObject:date];
}

// sort the array of dates
[tempArray sortUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
    // return date2 compare date1 for descending. Or reverse the call for ascending.
    return [date2 compare:date1];
}];

NSLog(@"%@", tempArray);

編集して文字列配列に入れる

NSMutableArray *correctOrderStringArray = [NSMutableArray array];

for (NSDate *date in tempArray) {
    NSString *dateString = [formatter stringFromDate:date];
    [correctOrderStringArray addObject:dateString];
}

NSLog(@"%@", correctOrderStringArray);

NSDateまた、 、NSString、についても読んでくださいNSDateFormatter。特に、それらが互いにどのように相互作用するか。

NSDateある時点です。フォーマット情報は含まれません (決して含まれません)。

NSDateFormatter特定の日付 (つまり、ある時点) に関する情報は保持されません。NSDate日付を取得し、指定したと に基づいて文字列を生成するために使用されformatます。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

于 2013-08-27T10:26:28.567 に答える
0

適切なコンパレータを自分で作成する必要があります。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:enUSPOSIXLocale];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSComparator myDateComparator = ^NSComparisonResult(id obj1,
                                                    id obj2) {
    NSDate *date1 = [formatter dateFromString:obj1];
    NSDate *date2 = [formatter dateFromString:obj2];

    return [date2 compare:date1]; // sort in descending order
};

次に、次のようにして配列を並べ替えます。

NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005",
                       @"02/24/2006", @"03/19/2007", @"07/14/2011",
                       @"08/17/2007", @"10/04/2007", @"10/31/2006",
                       @"12/05/2012", @"12/06/2006", @"12/23/2008"];

NSArray *sortedArray = [dateArray sortedArrayUsingComparator:myDateComparator];

NSLog(@"Sorted array is %@", sortedArray);

これにより、文字列が並べ替えられます(変更された配列ではありません)。文字列操作を使用して m/d/y を ymd に変換することもできますが、小さなデータ セットの場合はこのアプローチで問題ないと思います。

于 2013-08-27T12:28:39.493 に答える
0

試す

[formatter setDateFormat:@"MM/dd/yyyy"]

3行目にあるものの代わりに。これにより、期待する日付形式が得られるはずです。並べ替えに関しては、私は少し混乱しています。ソートするコードはありません。日付文字列を並べ替えたり、フォーマットしたりしようとしていますか?

于 2013-08-27T10:26:00.257 に答える