2017-06-03 22 views
0

私の比較コードである:比較2つのNSDateオブジェクトがある場合、以下同じ

(lldb)PO [self.reminderResultsArray objectAtIndex:

以下
int countTrue = 0; 
//NSDate *datee = [[self.reminderResultsArray objectAtIndex:0] date]; 

for(int i = 0; i < self.reminderResultsArray.count; i++){ 
    if([[NSCalendar currentCalendar] isDate:self.actualSelectedDate inSameDayAsDate:[[self.reminderResultsArray objectAtIndex:i] date]]){ 
     countTrue++; 
     NSLog(@"Count true: %d", countTrue); 
    } 
} 

self.reminderResults.arrayのデータであり、1 ]日付] 2017年6月2日午前9時38分35秒+0000

(lldb)PO [self.reminderResultsArray objectAtIndex:0]日付] 2017年5月27日9時37分48秒+0000

(lldb)PO [self.reminderResultsArray objectAtIndex:1]日付] 2017年6月2日9時38分35秒+0000

(lldb)PO [self.reminderResultsArray objectAtIndex:2]日付] 2017年6月2日10時09分48秒+0000

(lldb)PO [self.reminderResultsArray objectAtIndex:3]日付] 2017年6月2日10時12分30秒+0000

(lldb)po [[self.reminderResultsArray objectAtIndex:4] date] 2017-06-03 08:49:33 +0000

self.actualSelectedDate値は次のとおりです。右のことで

po self.actualSelectedDate 
2017-06-02 16:00:00 +0000 

は、countTrue値は3であるべきではなく、それだけで1私のコードに問題の値を返すのですか?

+0

あなたは日付部分だけを気にして、時間部分を無視したいですか? –

+0

@AndréSlotta日付部分のみ – SPUDERMAN

答えて

1

ログを確認すると、時間が異なるため、NSCalenderの方法ではそれらを異なる日付とみなします。

日付比較のみを行う場合は、まず日付フォーマッタdd/mm/yyyyを使用して日付オブジェクトを作成し、日付を比較します。

または代わりに、あなただけがこのようにそれを行うことができNSDateオブジェクトの日付部分を気にしている場合、あなたは、月と年のコンポーネント1日

+ (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 { 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay; 
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1]; 
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2]; 

    return [comp1 day] == [comp2 day] && 
    [comp1 month] == [comp2 month] && 
    [comp1 year] == [comp2 year]; 
} 
+1

メソッドinSameDayAsDateは、両方の日付が**同じ日**以内にあるかどうか*をチェックすることになっています。 – vadian

+0

ドキュメントごとに、はい、両方の日付が同じ日にあるかどうかを確認する必要があります。私は別のアプローチで答えを更新しました。 –

0

を確認することができます。

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" 

let actualSelectedDateString = "2017-06-02 16:00:00 +0000" 
let actualSelectedDate = dateFormatter.dateFromString(actualSelectedDateString)! 

let dateStrings = ["2017-06-02 09:38:35 +0000", 
        "2017-05-27 09:37:48 +0000", 
        "2017-06-02 09:38:35 +0000", 
        "2017-06-02 10:09:48 +0000", 
        "2017-06-02 10:12:30 +0000", 
        "2017-06-03 08:49:33 +0000"] 

let dates = dateStrings.map({dateFormatter.dateFromString($0)!}) 

let calendar = NSCalendar.currentCalendar() 
let count = dates.filter({calendar.isDate($0, inSameDayAsDate: actualSelectedDate)}).count 
0

はこれを試してみてください、

int countTrue = 0 ; 

    NSString *actualSelectedDateAsString = @"2017-06-02 16:00:00 +0000"; 

    NSArray *reminderResultsArray = @[@"2017-06-02 09:38:35 +0000", 
             @"2017-05-27 09:37:48 +0000", 
             @"2017-06-02 09:38:35 +0000", 
             @"2017-06-02 10:09:48 +0000", 
             @ "2017-06-02 10:12:30 +0000", 
             @"2017-06-03 08:49:33 +0000"]; 

// use date formatter to convert string to date and set the date format as per your requirement. 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; 

    NSDate *actualSelectedDate = [dateFormatter dateFromString:actualSelectedDateAsString]; // convert string to date. 


    for (int i=0 ; i<reminderResultsArray.count ; i++){ 

     if([[NSCalendar currentCalendar]isDate:actualSelectedDate inSameDayAsDate:[dateFormatter dateFromString:[reminderResultsArray objectAtIndex:i]]]){ 

      countTrue++; 

      NSLog(@"Count true: %d", countTrue); 
     } 

    } 

    NSLog(@"Count true: %d", countTrue); // result would be 4 
1

日付は、ログに記録されるとき、です。自体がUTC(すなわち、タイムゾーン+0000)。これはあなたを誤解するかもしれません。

[NSCalendar currentCalendar]から取得しているカレンダーオブジェクトは、システムの現在のタイムゾーンを使用します。あなたのタイムゾーンがUTCでない限り、出力に表示される月の日は、-isDate:inSameDayAsDate:の比較に関連する月の日ではありません。 (一般的なケースでは、月の日よりも多くのコンポーネントは、タイムゾーンによって日付の文字列表現が異なる場合があります。)

比較がうまくいかないと思う理由を理解するには、まず、あなたのタイムゾーンのの年月日が何であるかを調べる必要があります。その後、それは明らかになります。私は-isDate:inSameDayAsDate:メソッドが正常に動作していて、あなたが作業していた日付の実際の日(あなたのタイムゾーン内)を誤解していると思います。

また、実際の日がUTCであることに本当に関心がある場合は、timeZone[NSTimeZone timeZoneWithName:@"UTC"]に設定されているカレンダーオブジェクトを使用する必要があります。

関連する問題