5

私には3つの変数があります。

startDate Wed Apr 12 --endDate-- Wed Jun 11 timeDuration- 11.00 am from 11.00 pm。(これは文字列で、午前11時が開始時刻、午後12時が終了時刻です)

1.)次に、現在の日付と時刻([NSDate date])を取得し、現在の日付がとの間にあるstartDateendDateどうかを確認してから、現在の時刻がtimeDuration(の間にあるように11.00am from 11.00pm)の間にあるかどうかを確認する必要があります。

2.)現在の時刻が期間の間にある場合(間11.00 am from 11.00 pmなど)、次のシナリオの残り時間を計算する必要があります。

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

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

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

4

2 に答える 2

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でご覧ください。

于 2012-05-20T07:17:10.827 に答える
1

基本的な考え方は、startDateandendDateを実際NSDateの に変換し、それらを現在の日付と比較することです。次に、現在の日付が適切な範囲内にある場合は、開始時刻と終了時刻を現在の日付に追加して、開始時刻と終了時刻の特定の時点を見つけます。これらの日付を取得したら、NSDate のメソッドcompareと メソッドを使用して、必要な値を取得できます。timeIntervalSinceDate

// 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);
于 2012-05-21T04:06:00.400 に答える