2012-01-25 15 views
11

2つのNSDateをNOW([NSDate date])と比較したいと考えています。日付コンポーネントを無視して2つのNSDateの時間を比較する

NSDate *date1 = [NSDate dateWithString:@"1982-02-12 07:00:00 +0100"]; 
NSDate *now = [NSDate dateWithString:@"2012-01-25 10:19:00 +0100"]; //example 
NSDate *date2 = [NSDate dateWithString:@"1989-02-12 15:00:00 +0100"]; 

私は現在date1とdate2の間にあるかどうかチェックしたいと思います。上記の例ではこれが当てはまります。日付コンポーネントは完全に無視する必要があるため、時間コンポーネントのみを比較する必要があります。どのように私はこれを達成することができますか?

ありがとうございます!

+0

重複の重複:http://stackoverflow.com/questions/8276187/determine-if-todays-date-is-in-a-range-of-two-dates-on-ios – Sarah

+0

可能重複[NSDateの時間の比較](http://stackoverflow.com/questions/3773279/comparing-time-in-nsdate) – dasblinkenlight

答えて

26
unsigned int flags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
NSCalendar* calendar = [NSCalendar currentCalendar]; 

NSDateComponents* components = [calendar components:flags fromDate:date1]; 

NSDate* timeOnly = [calendar dateFromComponents:components]; 

これは、時間/分/秒以外のすべてが共通の値にリセットされた日付オブジェクトを提供します。次に、標準のNSDate比較関数を使用することができます。参考のため

、マーケットプレイスとは逆質問です:Comparing two NSDates and ignoring the time component

+0

アダムありがとうございました。 1つのことがあります:すべての計算の後、時間コンポーネントも変更されます。時間は20分減算されます。これはどのように可能ですか? – Rens

+1

奇妙なことに、20分は奇数のオフセットです。これは1/1/1以降のカレンダーの変更に関係するかもしれません。私はそれを自分で試してみましたが、表示された時間はそのままでGMTからのオフセット(例えばタイムゾーン)は変わりました。 NSDateComponents * components = ... 'の後に' [components setYear:1980];を追加し、その効果をチェックしてください(1980年以降カレンダーの変更はありませんでした。 GMTオフセットの差異を取り除いた私のために。 – CRD

+0

ありがとうございますが、日付を使用せずに午後8時から午前1時までの時間を比較するにはどうすればよいですか? – Filippo

-2
NSDateFormatter* formatterDate = [[[NSDateFormatter alloc] init] autorelease]; 

    formatterDate.dateStyle = NSDateFormatterMediumStyle; // whatever format you like 

    NSDate *first_Date = [formatterDate dateFromString:@""]; 
    NSDate *second_Date = [formatterDate dateFromString:@""]; 
    NSDate *todaysDate = [NSDate date]; 


    NSTimeInterval timeIntFormFirstDate = [todaysDate timeIntervalSinceDate:First_Date]; 
    NSTimeInterval timeIntFronLastDate = [second_Date timeIntervalSinceDate:todaysDate]; 

    int interval1 = timeIntFormFirstDate/60; 
    int interval2 = timeIntFronLastDate/60; 

    if (interval1 >0 && interval2 >0) 
    { 
     NSLog(@"Today's date is between first and second date"); 
    } 
+0

しかし、これは日付コンポーネントを無視していないのですか? – Rens

1

あなたは今日の開始を表す日付を作成し、境界の日付を取得するためのコンポーネントとして、それまでの時間を追加することができます。

NSDate *now = [NSDate date]; 
NSDate *startOfToday; 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now]; 


NSDateComponents *startComps = [[NSDateComponents alloc] init]; 
startComps.hour = 7; 
startComps.minute = 30; 

NSDateComponents *endComps = [[NSDateComponents alloc] init]; 
endComps.hour = 20; 

NSDate *startDate = [[NSCalendar currentCalendar] dateByAddingComponents:startComps toDate:startOfToday options:0]; 
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:endComps toDate:startOfToday options:0]; 

if ([startDate timeIntervalSince1970] < [now timeIntervalSince1970] && [now timeIntervalSince1970] < [endDate timeIntervalSince1970]) { 
    NSLog(@"good"); 
} 
+0

これは素晴らしいですね。このコードを再利用しようとしていますが、startComps.hour/minuteとend.hour/minuteに渡したい関数を作って、if文を関数の外で使う方法これを試してください。 - (void)getStartTime:(NSDateComponents *)startComps getEndTime:(NSDateComponents *)endComps { NSDate * now = [NSDate date]; NSDate * startOfToday; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now]; 'しかし、それは機能しませんでしたか? –

+0

私は古い質問でここにフルコードを追加しましたhttp://stackoverflow.com/questions/26476231/objective-c-compare-two-times –

関連する問題