2012-05-20 11 views
5

私は3つの変数を持っています。時間と日付が特定の日付と時刻の間にあるかどうか確認してください

たstartDate - Wed Apr 12 endDateに - Wed Jun 11 timeDuration - 11.00 am from 11.00 pm

1.)今、現在の日付と時刻([NSDate date])を取得し、現在の日付がstartDateとの間であるかどうかを確認する必要があります。これは、文字列です。 endDateし、現在の時刻がtimeDurationとの間にある場合、現在時刻が()11.00 am from 11.00 pm間のように持続時間の間にある場合、私は、次までの残り時間を計算する必要がある)

2(11.00am from 11.00pmとの間のように)チェックシナリオ;

)。時間が10amの場合は、開始時刻を計算する必要があります。これは11.00amです。 (答えは1 hourです)。

B。)時間が開始時間より大きいので時間が、11.45AMある場合(11.00amあった)i)は11.00pmある(終了時刻までの残り時間を計算する必要があります。

c。)時間が11.45pmの場合は、終了時刻(11.00pm)よりも大きいので、「時間超過」というNSLogを出力する必要があります。

+0

可能重複[NSDate他の2つのNSDatesの間で発生したかどうか確認する方法](HTTP:/あなたはこれらの日付を持っていたら、あなたはあなたが必要とする値を取得するNSDateのcomparetimeIntervalSinceDateメソッドを使用することができます/stackoverflow.com/questions/1072848/how-to-check-if-an-nsdate-occurs-between-two-other-nsdates)、http://stackoverflow.com/questions/1987506、http:// stackoverflow。 com/questions/9807370 /、http://stackoverflow.com/questions/8295008/ –

+0

現在の時刻が午前12:15の場合はどうなりますか?昨日から遅すぎるのか、早すぎるのですか? – lnafziger

+0

startDateはどのような変数ですか? NSDateまたはNSString? – lnafziger

答えて

1

基本的な考え方はstartDateendDateを実際のNSDateに変換して現在の日付と比較することです。次に、現在の日付が適切な範囲にある場合は、現在の日付に開始時刻と終了時刻を追加して、開始時刻と終了時刻の特定の時刻を取得します。

// NOTE: NO error checking is being done in this code. 

// Starting variables 
NSString *startDateString  = @"Wed Apr 12"; 
NSString *endDateString  = @"Wed Jun 11"; 
NSString *timeDurationString = @"11.00 am from 11.00 pm"; 

// Get the current date 
NSDate *currentTime  = [NSDate date]; 
NSCalendar *cal   = [NSCalendar currentCalendar]; 
NSDateComponents 
     *currentDateComps = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit 
            fromDate:currentTime]; 

// Add the current year onto our date string 
NSString *startDateStringWithYear = [NSString stringWithFormat:@"%@ %d", startDateString, currentDateComps.year]; 
NSString *endDateStringWithYear = [NSString stringWithFormat:@"%@ %d", endDateString, currentDateComps.year]; 

// Calculate NSDate's for start/endDate 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"EEE MM dd yyyy"]; 
NSDate *startDate = [formatter dateFromString:startDateStringWithYear]; 
NSDate *endDate = [formatter dateFromString:endDateStringWithYear]; 

// Return if today's date is not between the start and end dates 
if ([startDate compare:currentTime] == NSOrderedDescending || 
    [endDate compare:currentTime] == NSOrderedAscending) 
{ 
    return; 
} 

// Break the timeDurationString into separate words 
NSArray *timeDurationStringWords = [timeDurationString componentsSeparatedByString:@" "]; 

// Calculate NSDate's for the start time for today: 
NSString *startTimeString = [timeDurationStringWords objectAtIndex:0]; 
currentDateComps.hour  = [[startTimeString substringToIndex:2] intValue]; 
currentDateComps.minute = [[startTimeString substringFromIndex:3] intValue]; 
if ([[timeDurationStringWords objectAtIndex:1] isEqualToString:@"pm"]) 
{ 
    currentDateComps.hour += 12; 
} 
NSDate *startTime   = [cal dateFromComponents:currentDateComps]; 

// And now the end time for today 
NSString *endTimeString = [timeDurationStringWords objectAtIndex:3]; 
currentDateComps.hour  = [[endTimeString substringToIndex:2] intValue]; 
currentDateComps.minute = [[endTimeString substringFromIndex:3] intValue]; 
if ([[timeDurationStringWords objectAtIndex:4] isEqualToString:@"pm"]) 
{ 
    currentDateComps.hour += 12; 
} 
NSDate *endTime   = [cal dateFromComponents:currentDateComps]; 

// Now we have what we really want: A specific start time, current time, and end time. 

// Check to see if we are waiting to start: 
if ([startTime compare:currentTime] == NSOrderedDescending) { 
    NSTimeInterval minutesToStartTime = [startTime timeIntervalSinceDate:currentTime]/60; 
    NSLog(@"Start time is in %02d+%02d", (int)(minutesToStartTime/60), (int)minutesToStartTime % 60); 
    return; 
} 

// Check to see if we are late: 
if ([endTime compare:currentTime] == NSOrderedAscending) { 
    NSLog(@"Time Exceeded"); 
    return; 
} 

// We are between the two times: 
NSTimeInterval minutesToEndTime = [endTime timeIntervalSinceDate:currentTime]/60; 
NSLog(@"End time is in %02d+%02d", (int)(minutesToEndTime/60), (int)minutesToEndTime % 60); 
+0

しかし、 'currentTime'が' startDateString'または 'endDateString'と等しい場合、' if([startDate compare:currentTime] == NSOrderedDescending .... 'ブロックを実行し、残り時間を計算しません – Illep

+0

'== NSOrderedDescending'を'!= NSOrderedAscending'に変更します(これは基本的に '<'ではなく '<='を意味します。) – lnafziger

+0

これはあなたを助けましたか? – lnafziger

1

- (NSComparisonResult)compare:(NSDate *)anotherDate
は、startDateとendDateの現在の日付を比較できます。

NSComparisonResult 

enum { 
    NSOrderedAscending = -1, 
    NSOrderedSame, 
    NSOrderedDescending 
};  

例:

NSDate *currentDate = [NSDate date]; 
if (([currentDate compare:startDate ] == NSOrderedDescending) && 
    ([currentDate compare:endDate ] == NSOrderedAscending)) { 

    //currentDate is between startDate and endDate. 
} 

またはbbumによってthisソリューションを見てみましょう。

+0

私に例を教えてもらえますか? – Illep

+0

しかし、どのように時間を表示できますか(質問2)? – Illep

関連する問題