2012-05-20 9 views
5

मेरे पास 3 चर हैं;जांचें कि समय और तारीख किसी विशेष दिनांक और समय के बीच है

STARTDATE - Wed Apr 12 ENDDATE - Wed Jun 11 TIMEDURATION - 11.00 am from 11.00 pm। (यह एक स्ट्रिंग है, 11AM प्रारंभ समय है और 12 पीएम अंत समय है)

1.) अब, मुझे वर्तमान दिनांक और समय ([NSDate date]) प्राप्त करने की आवश्यकता है और जांचें कि वर्तमान दिनांक startDate के बीच है या नहीं और endDate और उसके बाद जाँच लें कि वर्तमान समय timeDuration के बीच है

2.) (में 11.00am from 11.00pm के बीच के रूप में) वर्तमान समय समय अवधि के बीच है, तो (11.00 am from 11.00 pm के बीच में) के रूप में मैं समय निम्न के शेष की गणना करनी है परिदृश्यों;

ए।) यदि समय 10 बजे है, तो मुझे उस समय की गणना करने की आवश्यकता है जो 11.00am है। (उत्तर 1 hour है)।

ख।) यदि समय, 11.45AM है के बाद से समय प्रारंभ समय (जो 11.00am था) मैं समय समाप्ति समय के लिए शेष गणना करने के लिए (जो 11.00pm है) की जरूरत से अधिक है।

सी।) यदि समय 11.45pm है, क्योंकि समय अंत समय से अधिक है (जो 11.00pm है), मुझे एक एनएसएलॉग मुद्रित करने की आवश्यकता है कि 'समय समाप्त हो गया'।

+0

संभव डुप्लिकेट [कैसे करता है, तो एक NSDate दो अन्य NSDates के बीच होता है चेक करने के लिए] (http:/एक बार जब आप उन तारीखों है, तो आप मान कि आप की आवश्यकता पाने के लिए NSDate की compare और timeIntervalSinceDate तरीकों का उपयोग कर सकते हैं /stackoverflow.com/questions/1072848/how-to-check-if-an-nsdate-occurs-between-two-other-nsdates), http://stackoverflow.com/questions/1987506, http: // stackoverflow। कॉम/प्रश्न/9807370 /, http://stackoverflow.com/questions/8295008/ –

+0

क्या होगा यदि वर्तमान समय 12:15 बजे है? क्या कल से बहुत देर हो चुकी है, या आज भी बहुत जल्दी है ?? – lnafziger

+0

किस प्रकार का चर शुरू होता है? एक एनएसडीएटी या एनएसएसटींग? – lnafziger

उत्तर

1

मूल विचार startDate और endDate को वास्तविक 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 तुलना: वर्तमान समय] == NSOrderedDescending .... 'ब्लॉक निष्पादित करेगा, और शेष समय की गणना नहीं करता है मैं इसे कैसे ठीक कर सकता हूं? – Illep

+0

'== NSOrderedDescending' को'! = NSOrderedAscending' में बदलें (जिसका मूल रूप से '<' – lnafziger

+0

की बजाय '<=' का अर्थ है क्या इससे आपकी मदद मिली? – lnafziger

1

आप - (NSComparisonResult)compare:(NSDate *)anotherDate
का उपयोग कर सकते हैं वर्तमान दिनांक की तुलना दिनांक और समाप्ति दिनांक की तुलना करें।

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

संबंधित मुद्दे