iphone एनएससीएंडेंडर सप्ताह के पहले दिन




cocoa calendar (13)

इसे इस्तेमाल करे:

NSCalendar *yourCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
[yourCal setFirstWeekday:0];

क्या किसी को पता है कि सप्ताह के पहले दिन एनएससीएंडेंडर पर सेट करने का कोई तरीका है, या क्या ऐसा कैलेंडर है जो सोमवार को रविवार के बजाय सप्ताह के पहले दिन के रूप में पहले से ही है। मैं वर्तमान में एक ऐप पर काम कर रहा हूं जो एक हफ्ते के काम के आसपास आधारित है, और इसे सोमवार को रविवार को शुरू करने की जरूरत है। मैं इसके आसपास काम करने के लिए कुछ काम कर सकता हूं, लेकिन बहुत सारे कोने के मामले होंगे। मैं प्लेटफ़ॉर्म को मेरे लिए ऐसा करना पसंद करूंगा।

अग्रिम में धन्यवाद

यहां कुछ कोड है जिसका मैं उपयोग कर रहा हूं। यह अब शनिवार है, इसलिए मुझे उम्मीद है कि सप्ताहांत 7 की बजाय 6 होगा। इसका मतलब यह होगा कि रविवार को 0 से ऊपर रोल करने के बजाय 7 होगा

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setFirstWeekday:0];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit;
NSDateComponents *todaysDate = [gregorian components:unitFlags fromDate:[NSDate date]];
int dayOfWeek = todaysDate.weekday;

मुझे अन्य संदेशों में गलतफहमी दिखाई देती है। पहला सप्ताहांत, जो भी हो, उसके पास नंबर 1 नहीं है। डिफ़ॉल्ट रूप से रविवार = 1 "कोको के लिए दिनांक और समय प्रोग्रामिंग मार्गदर्शिका का परिचय: कैलेंड्रिकल गणना":

"ग्रेगोरियन कैलेंडर में रविवार के लिए सप्ताहांत मूल्य 1 है"

सोमवार को पहले कार्यदिवस के रूप में मेरे पास एकमात्र उपाय गणना को ठीक करने के लिए क्रूर बल की स्थिति है

NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [cal components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
// set to 7 if it's Sunday otherwise decrease weekday number
NSInteger weekday=[comps weekday]==1?7:[comps weekday]-1; 

क्रिस के जवाब में समस्या बढ़त का मामला है जहां सप्ताह की शुरुआत पहले महीने में शुरू होती है। यहां कुछ आसान कोड है और यह एज केस भी जांचता है:

// Finds the date for the first day of the week
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // Edge case where beginning of week starts in the prior month
    NSDateComponents *edgeCase = [[NSDateComponents alloc] init];
    [edgeCase setMonth:2];
    [edgeCase setDay:1];
    [edgeCase setYear:2013];
    NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase];

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]);

    // Find Sunday for the given date
    components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]);

    return [calendar dateFromComponents:components];
}

ऐसा करने का मेरा सरल तरीका सोमवार = 0, रविवार = 6 प्राप्त करना है:

    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
    NSInteger dayNumStartingFromMonday = ([dateComponents weekday] - 2 + 7) % 7;    //normal: Sunday is 1, Monday is 2

नीचे किनारे के मामले को भी शामिल किया गया है,

- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];


   NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
    [components setWeekday:2]; // 1 == Sunday, 7 == Saturday
    if([[calendar dateFromComponents:components] compare: curDate] == NSOrderedDescending) // if start is later in time than end
    {
        [components setWeek:[components week]-1];
    }

    return [calendar dateFromComponents:components];
}

सेट फर्स्ट वीकडे : एनएससीएंडर ऑब्जेक्ट पर। रिसीवर के लिए पहले सप्ताह के सूचकांक सेट करता है।

- (void)setFirstWeekday:(NSUInteger)weekday

चाल करना चाहिए।


Iv ने nscalender का उपयोग करके किसी भी सप्ताह के नाम को प्रदर्शित करने का तरीका पाया .. निम्नलिखित कोड का उपयोग कर .. परिणाम देखने के लिए बस अपने कंसोल को एक्सकोड मेनू बार से खोलें। कॉपी अपने दृश्य में निम्न कोड पेस्ट करें सप्ताह के पहले दिन को प्राप्त करने के लिए डिडलोड विधि

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yyyy :EEEE"];
NSString *dateString = [dateFormat stringFromDate:today];
NSLog(@"date: %@", dateString);
[dateFormat release];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today];
[components setDay:([components day]-([components weekday]-1))];

NSDate *beginningOfWeek = [gregorian dateFromComponents:components];
NSDateFormatter *dateFormat_first = [[NSDateFormatter alloc] init];
[dateFormat_first setDateFormat:@"MM/dd/yyyy :EEEE"];
NSString *dateString_first = [dateFormat_first stringFromDate:beginningOfWeek];
NSLog(@"First_date: %@", dateString_first);

आउटपुट होगा:

 date: 02/11/2010 :Thursday
 First_date: 02/07/2010 :Sunday

चूंकि मैंने इस कार्यक्रम को 2/11/2010 को चलाया था, इसलिए आपको वर्तमान तिथि के आधार पर वांछित आउटपुट मिलेगा।

इसी प्रकार यदि आप सप्ताह के पहले कार्य दिवस यानी सोमवार की तारीख प्राप्त करना चाहते हैं तो बस कोड को थोड़ा सा संशोधित करें:

परिवर्तन: [components setDay:([components day]-([components weekday]-1))];

टू [components setDay:([components day]-([components weekday]-2))];

उस सप्ताह के लिए सोमवार की तारीख प्राप्त करने के लिए ..

इसी तरह आप पूर्णांक -1, -2 और इतने पर बदलकर सात कार्यदिवसों की तारीख को खोजने का प्रयास कर सकते हैं ...

आशा है कि आपके प्रश्न का उत्तर दिया गया है ..

धन्यवाद, बोन्सन डायस


आईएसओ 8601 कैलेंडर में यह डिफ़ॉल्ट रूप से सोमवार को पहला सप्ताह का सेट होता है।


मेरी राय में यह सेटिंग्स उपयोगकर्ता लोकेल के अनुसार गतिशील होना चाहिए। इसलिए किसी का उपयोग करना चाहिए:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setLocale:[NSLocale currentLocale]];

यह कैलेंडर को उपयोगकर्ता सप्ताह के अनुसार स्वचालित रूप से पहले सप्ताह के दिन सेट करने का कारण बन जाएगा। जब तक आप एक विशिष्ट उद्देश्य / उपयोगकर्ता लोकेल के लिए अपना ऐप विकसित नहीं कर रहे हैं (या उपयोगकर्ता को इस दिन चुनने की अनुमति देना पसंद करते हैं)।


... क्या ऐसा कैलेंडर है जो सोमवार को रविवार के बजाय सप्ताह के पहले दिन के रूप में पहले से ही है।

किसी दिन, वहाँ होगा।


मुझे यहां बहुत सारे उत्तरों के साथ परेशानी थी। । शायद यह सिर्फ मुझे था। ।

यहां एक उत्तर दिया गया है जो मेरे लिए काम करता है:

- (NSDate*)firstDayOfWeek
{
    NSCalendar* cal = [[NSCalendar currentCalendar] copy];
    [cal setFirstWeekday:2]; //Override locale to make week start on Monday
    NSDate* startOfTheWeek;
    NSTimeInterval interval;
    [cal rangeOfUnit:NSWeekCalendarUnit startDate:&startOfTheWeek interval:&interval forDate:self];
    return startOfTheWeek;
}

- (NSDate*)lastDayOfWeek
{
    NSCalendar* cal = [[NSCalendar currentCalendar] copy];
    [cal setFirstWeekday:2]; //Override locale to make week start on Monday
    NSDate* startOfTheWeek;
    NSTimeInterval interval;
    [cal rangeOfUnit:NSWeekCalendarUnit startDate:&startOfTheWeek interval:&interval forDate:self];
    return [startOfTheWeek dateByAddingTimeInterval:interval - 1];
}

अद्यतन करें:

जैसा कि @vikingosegundo द्वारा इंगित किया गया है (सामान्यतः) स्थानीय रूप से यह तय करने के लिए सबसे अच्छा है कि कौन सा दिन सप्ताह की शुरुआत है, हालांकि इस मामले में ओपी सोमवार को सप्ताह की शुरुआत के लिए पूछ रहा था, इसलिए हम प्रतिलिपि बनाते हैं सिस्टम कैलेंडर, और firstWeekDay ओवरराइड करें।


संपादित करें: यह किनारे के मामले की जांच नहीं करता है जहां सप्ताह की शुरुआत पहले महीने में शुरू होती है। इसे कवर करने के लिए कुछ अद्यतन कोड: https://.com/a/14688780/308315

यदि कोई भी इस पर ध्यान दे रहा है, तो आपको इसका उपयोग करने की आवश्यकता है

ordinalityOfUnit:inUnit:forDate:

और पहली बार सेट करें 2. (1 == रविवार और 7 == शनिवार)

यहां कोड है:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7
NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal);

याद रखें, सप्ताह के दिनों के लिए टर्मिनलों सप्ताह के पहले दिन के लिए 1 से शुरू होता है, शून्य नहीं।

दस्तावेज़ीकरण लिंक


कैलेंडर nextWeekend (आईओएस 10 या बाद में) और ordinality (धन्यवाद @ क्रिस-मार्केल)। मैं en_US कैलेंडर के लिए सप्ताह के पहले के रूप में सोमवार को मिला है।

यहां पहली बार फॉलबैक के साथ इसका एक उदाहरण दिया गया है:

extension Calendar {
    var firstWorkWeekday: Int {
        guard #available(iOS 10.0, *) else{
            return self.firstWeekday
        }
        guard let endOfWeekend = self.nextWeekend(startingAfter: Date())?.end else {
            return self.firstWeekday
        }
        return self.ordinality(of: .weekday, in: .weekOfYear, for: endOfWeekend) ?? self.firstWeekday
    }
}