2012-05-20 5 views
5

Ich habe 3 Variablen;Überprüfen Sie, ob die Uhrzeit und das Datum zwischen einem bestimmten Datum und Uhrzeit liegt.

startdate - Wed Apr 12 endDate - Wed Jun 11 timeDuration - 11.00 am from 11.00 pm. (Dies ist eine Zeichenfolge, 11 Uhr ist die Startzeit und 12 Uhr ist die Endzeit)

1.) Jetzt muss ich das aktuelle Datum und Uhrzeit ([NSDate date]) und überprüfen, ob das aktuelle Datum zwischen startDate und ist endDate und dann prüfen, ob die aktuelle Zeit zwischen dem timeDuration (wie in zwischen 11.00am from 11.00pm)

2.) wenn die aktuelle Zeit zwischen der Zeitdauer (wie in zwischen 11.00 am from 11.00 pm) ich brauche die verbleibende Zeit der folgenden berechnen Szenarien;

a.) Wenn die Zeit 10 Uhr ist, muss ich die Zeit bis zur Startzeit berechnen, die 11.00am ist. (Die Antwort ist 1 hour).

b.) Wenn die Zeit 11.45AM ist, da die Zeit größer als die Startzeit ist (das war 11.00am) Ich brauche die verbleibende Zeit bis zum Ende der Zeit zu berechnen (was 11.00pm ist).

c.) Wenn die Zeit 11.45pm ist, da die Zeit größer als die Endzeit ist (die 11.00pm ist), ich brauche ein NSLog drucken zu sagen, dass ‚Zeitüberschreitung‘.

+0

möglich Duplikat von [Wie um zu überprüfen, ob ein NSDate zwischen zwei anderen NSDates auftritt] (http://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

Was ist, wenn die aktuelle Uhrzeit 12:15 Uhr ist? Ist es zu spät von gestern oder zu früh heute? – lnafziger

+0

Welche Art von Variable ist StartDate? Ein NSDate oder NSString? – lnafziger

Antwort

1

Die Grundidee besteht darin, Ihre startDate und endDate in tatsächliche NSDate konvertieren und sie mit dem aktuellen Datum zu vergleichen. Wenn sich das aktuelle Datum im richtigen Bereich befindet, fügen Sie die Start- und Endzeiten dem aktuellen Datum hinzu, um einen bestimmten Zeitpunkt für die Start- und Endzeit festzulegen. Sobald Sie diese Termine haben, können Sie die compare und timeIntervalSinceDate Methoden der NSDate verwenden, um die Werte zu erhalten, die Sie benötigen:

// 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

Aber wenn die 'currentTime' gleich dem' startDateString' oder 'endDateString' ist, wird der' if ([startDate compare: currentTime] == NSOrderedDescending .... 'Block ausgeführt, und die verbleibende Zeit wird nicht berechnet Wie kann ich das beheben? – Illep

+0

Ändern Sie '== NSOrderedDescending' in'! = NSOrderedAscending' (was im Grunde bedeutet '<=' anstatt nur '<'. – lnafziger

+0

Hat Ihnen das geholfen? – lnafziger

1

Sie können - (NSComparisonResult)compare:(NSDate *)anotherDate
verwenden, um das aktuelle Datum mit startDate und endDate zu vergleichen.

NSComparisonResult 

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

Beispiel:

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

    //currentDate is between startDate and endDate. 
} 

oder einen Blick auf this Lösung von bbum nehmen.

+0

Können Sie mir ein Beispiel zeigen? – Illep

+0

Aber wie kann ich die Zeit zeigen (Frage 2)? – Illep