2011-03-24 10 views
13

शामिल मैं इस श्रेणी NSDate करने के लिए जोड़ा है:का पता लगा रहा है, तो NSDate एक सप्ताह के अंत में दिन

- (bool)isWeekend 
{ 
    NSString* s = [self asString:@"e"]; 

    if ([s isEqual:@"6"]) 
    return YES; 
    else if ([s isEqual:@"7"]) 
    return YES; 
    else 
    return NO; 
} 

हेल्पर समारोह: अगर यह एक शनिवार या रविवार है

- (NSString*)asString:(NSString*)format 
{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:format]; 
    NSString *formattedDateString = [dateFormatter stringFromDate:self]; 
    [dateFormatter release]; 

    return formattedDateString; 
} 

isWeekend हाँ लौटना चाहिए। लेकिन अगर लोकेल रविवार को एक सप्ताह में शुरू होता है तो यह काम नहीं करता है, इस मामले में शुक्रवार 6 दिन होगा और शनिवार 7 दिन होगा।

मैं इसे कैसे हल कर सकता हूं?

+1

यह मान लेना कि 'asString:' सुरक्षित है तिथि निर्दिष्ट प्रारूप के साथ एक NSDateFormatter बनाता है, फिर NSDate चलाता है इसके माध्यम से? – Tommy

उत्तर

23

आप उपयोग करना चाहते हैं NSCalendar और NSDateComponents:।

NSDate *aDate = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSRange weekdayRange = [calendar maximumRangeOfUnit:NSWeekdayCalendarUnit]; 
NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:aDate]; 
NSUInteger weekdayOfDate = [components weekday]; 

if (weekdayOfDate == weekdayRange.location || weekdayOfDate == weekdayRange.length) { 
    //the date falls somewhere on the first or last days of the week 
    NSLog(@"weekend!"); 
} 

यह धारणा है कि सप्ताह के पहले और अंतिम दिन "सप्ताह समाप्त होता है" (जो ग्रेगोरियन कैलेंडर के लिए सच है शामिल तहत काम कर रहा है यह अन्य कैलेंडर में सच नहीं हो सकता है)।

+1

मुझे इस समाधान को काम करने की उम्मीद नहीं थी। लेकिन यह करता है। :-) रविवार को सप्ताह के शुरू होने वाले स्थानीय लोगों के साथ-साथ इसे सोमवार को शुरू करने वाले लोगों के लिए भी। मुझे स्वीकार करना होगा कि मैं maxRangeOfUnit को समझ नहीं पा रहा हूं:। – Kobski

+1

@ कोब्स्की 'maxRangeOfUnit:' मूल रूप से यह प्राप्त करने के लिए है कि सप्ताह में कितने दिन हैं। –

+0

@ डेव-डेलोंग इसे स्पष्ट करने के लिए समय निकालने के लिए धन्यवाद, लेकिन क्या वह हमेशा 7 नहीं होगा? मैंने मूल्यों को देखने के लिए कुछ डीबग कोड जोड़े और मैंने जिन इलाकों की कोशिश की है, उनके लिए स्थान 1 है और लंबाई 7 है। लेकिन सप्ताहांत होने के लिए सप्ताहांत ओफडेट 1 या 7 क्यों होना चाहिए? अधिकांश आधुनिक कैलेंडर में – Kobski

11

आईओएस 8 के रूप में, आप पर isDateOnWeekend: का उपयोग कर सकते हैं।

4

स्विफ्ट में:

func isWeekend(date: NSDate) -> Bool { 
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
    return calendar.isDateInWeekend(date) 
} 
5

स्विफ्ट में 3+:

extension Date { 
    var isWeekend: Bool { 
    return NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!.isDateInWeekend(self) 
    } 
} 
+1

पर उपयोग करें! तेजी से बनाम objc के लिए ... – Yohst

+0

@Yohst हा, हाँ! स्विफ्ट सुंदर संक्षिप्त हो सकता है :) –

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