2011-04-07 12 views
6

तो, मुझे एक मुश्किल समय है (कोई इरादा नहीं है) यह पता लगाना कि क्या एनएसडीएटी एक विशिष्ट सीमा के भीतर है। इस पर विचार करें: 5:00 अपराह्न और 6:00 बजे के बीच एक निर्धारित यात्रा। मैं यह जानना चाहता हूं कि निर्धारित समय वर्तमान समय के +/- 15 मिनट के भीतर है या नहीं। इस प्रकार मेरा सुरक्षित रेंज 4:45 अपराह्न से 6:15 बजे है। मैं निर्धारित कैसे कर सकता हूं कि निर्धारित यात्रा सीमा के अंदर या बाहर है या नहीं? यहां कोड है जो अब तक मिला है, जो बिल्कुल काम नहीं करता है ...कैसे पता लगाएं कि एक NSDate निर्दिष्ट सीमा के भीतर है या नहीं?

- (BOOL)isInScheduledRange { 
// NSLog(@"Start: %f", [self.start timeIntervalSinceNow]); 
// NSLog(@"End: %f", [self.end timeIntervalSinceNow]); 
//  
// if (([self.start timeIntervalSinceNow] >= -900) && ([self.end timeIntervalSinceNow] <= 3600)) { 
//  NSLog(@"In Range"); 
//   
//  return YES; 
// } 
//  
    NSDate *now = [[NSDate alloc] init]; 

// if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 900)) && (([self.end timeIntervalSinceDate:now] <= -900) && ([self.end timeIntervalSinceDate:now] >= 900))) { 
//  NSLog(@"In Range"); 
// } 

    NSLog(@"%@; %@; %@", now, self.start, self.end); 
// NSLog(@"%@; %@", [self.start timeIntervalSinceDate:now], [self.end timeIntervalSinceDate:now]); 

    if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 0)) && (([self.end timeIntervalSinceDate:now] >= 0) && ([self.end timeIntervalSinceDate:now] <= 900))) { 
     NSLog(@"In Range"); 
    } 

    return NO; 

    [now release]; 
} 

मैं कुछ मदद की सराहना करता हूं। मुझे इस समय की गणना के साथ कठिनाइयों का सामना करना पड़ रहा है।

एक अलग टिप्पणी पर, मैं कोई बात नहीं क्या मंच के साथ मैं ...

उत्तर

5

आप अगर शुरू करने का समय कम से कम 900 सेकंड के बाद वर्तमान समय है जाँच करना चाहते हैं, और अंत समय कम से कम 900 सेकंड से पहले वर्तमान समय है। timeIntervalSinceDate:पर तर्क के बाद < = 900 और अंत> = -900 के लिए जांच करने की आवश्यकता है, तो एक सकारात्मक संख्या देता है। साथ ही, आप वर्तमान तिथि प्राप्त करने और इसे timeIntervalSinceDate: पर पास करने के बजाय timeIntervalSinceNow का उपयोग कर अपने कोड को सरल बना सकते हैं। अंत में, यदि आप मान सकते हैं (या पहले सुनिश्चित किया गया है कि शुरुआत अंत से पहले है, तो आपको दो मध्य परीक्षणों की आवश्यकता नहीं है, क्योंकि दोनों को दोनों को सत्य होने के लिए सच होना होगा।

if([self.start timeIntervalSinceNow] <= 900 && [self.end timeIntervalSinceNow] >= −900) { 
    NSLog(@"In range") 
} 
+0

यह मेरा से बेहतर जवाब है। – Moshe

+0

यह काम करता है, और ऐसा लगता है कि मेरी पहली टिप्पणी की गई कोशिश निकटतम थी। सहायता के लिए धन्यवाद! – Gup3rSuR4c

0

काम कर रहा हूँ समय के साथ काम कर नफरत आप तीन NSDates बनाना होगा। फिर NSvalSinceReferenceDate का उपयोग करके NSDates को समय अंतराल में परिवर्तित करें और उनसे तुलना करें। आप NSDateComponents का उपयोग करके मैन्युअल रूप से NSDates सेट अप करते हैं।

3

यहाँ कुछ वर्बोज़ (और मूर्खतापूर्ण) कोड है कि इस समस्या को

NSTimeInterval secondsBeforeStart = [self.start timeIntervalSinceNow]; 
if (secondsBeforeStart > (15 * 60)) 
{ 
    // The result for '[self.start timeIntervalSinceNow]' is positive as long 
    // as 'self.start' remains in the future. We're not in range until there 
    // are 900 seconds to go or less. 
    NSLog(@"Still time to chill."); 

    // More than fifteen minutes to go so return NO. 
    return NO; 
} 
else 
{ 
    NSLog(@"OMG did I miss it!!!"); 
    NSTimeInterval secondsBeforeEnd = [self.end timeIntervalSinceNow]; 
    if (secondsBeforeEnd < -(15 * 60)) 
    { 
     // The result for '[self.end timeIntervalSinceNow]' is negative when 
     // 'self.end' is in the past. 
     // It's been more than 900 seconds since the end of the appointment 
     // so we've missed it. 
     NSLog(@"Ahhhhh!!!"); 

     // More than 900 seconds past the end of the event so return NO. 
     return NO; 
    } 
    else 
    { 
     // We are somewhere between 900 seconds before the start and 
     // 900 seconds before the end so we are golden. 
     NSLog(@"Whew, we made it."); 
     return YES; 
    } 
} 

तरह से मैं यह हो गया होता कोडित है |

BOOL inRange = NO; // Assume we are not in the proper time range. 

if ([self.start timeIntervalSinceNow] <= (15 * 60)) 
{ 
    // 'Now' is at least 900 seconds before the start time but could be later. 
    if ([self.end timeIntervalSinceNow] >= -(15 * 60)) 
    { 
     // 'Now' is not yet 900 seconds past the end time. 
     inRange = YES 
    } 
} 

return inRange; 

नोट करने के लिए अपने दृष्टिकोण बताते है: मैं हेवन वास्तव में इसे संकलित नहीं किया है, लेकिन मुझे पूरा यकीन है कि तर्क सही है।

अंत में, आप सूचना है कि आपके अंतिम दो पंक्तियों

return NO; 

    [now release]; 
} 

एक स्मृति रिसाव बनाया होगा किया था। (रिलीज और फिर वापसी; ^))

+0

यह आपके और @Ughoavgfhw के बीच एक कठिन विकल्प था क्योंकि आप दोनों ने वही बात अनिवार्य रूप से कहा था, लेकिन अंत में @ उघोवागफह का कोड व्यावहारिक रूप से मैंने जो लिखा था, उसके समान था, इसलिए मैं उसके साथ गया। ** कैसे **, मैं * एलओएल * पोस्ट और रिसाव पर टिप के लिए धन्यवाद देता हूं। – Gup3rSuR4c

2

यह एक दूरी की समस्या है - आप जानना चाहते हैं कि वर्तमान समय लक्ष्य समय के 900 सेकंड के भीतर है या नहीं। दो बिंदुओं के बीच अंतर का पूर्ण मूल्य लेकर दूरी की समस्याओं की गणना करें। अंतर के पूर्ण मूल्य को लेकर, दो नमूनों का क्रम कोई फर्क नहीं पड़ता।

/** 
* @brief Return YES if the current time is within 900 seconds of the meeting time (NSDate* time). 
*/ 
-(BOOL)currentTimeIsWithin900SecondsOf:(NSDate*)time 
{ 
    NSDate* now = [NSDate date]; 
    return fabs([now timeIntervalSinceReferenceDate] - [time timeIntervalSinceReferenceDate]) < 900; 
} 
संबंधित मुद्दे