2011-03-18 8 views
13

हैलो मैं एक firstWeekDay स्थापित करने के साथ एक समस्या है, यहाँ मैं क्या कर रहा है:NSDateComponents के साथ एक सप्ताह के पहले दिन हो रही है: बदलते साल

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:targetDate]; 
[comp setWeekday:2]; 

NSDate *firstWeekDay = [gregorian dateFromComponents:comp]; 

तो शनिवार 2011-01-01 targetDate, firstWeekDay है मेरे कैलेंडर में सोमवार 2011-12-26 प्रतीत होता है, लेकिन वास्तव में यह सोमवार 2010-12-26 होना चाहिए। मैं इसे सही कैसे बना सकता हूं?

+0

यह संभवतः कारण है कि आईओएस में अलार्म घड़ी 2011-01-01 पर कुछ उपयोगकर्ताओं के लिए ठीक से काम नहीं किया है? – Felix

उत्तर

1

इस

// adjust them for first day of previous week (Monday) 
[comp setWeekday:2]; 
[comp setWeek:([comp week] - 1)]; 

नोट इस समाधान मान लिया गया है सप्ताह के पहले दिन सोमवार का प्रयास करें।

+0

धन्यवाद, लेकिन आपकी विधि काम नहीं कर रही है। firstWeekDay अब 2011-12-20 – Roman

+0

बन गया हाँ, मेरे लिए काम करता है। –

35

इस समस्या को हल करने के लिए, NSYearForWeekOfYearCalendarUnit NSDateComponents में जोड़ें।

पूर्व:

NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate]; 

[comps setWeekday:2]; // 2: monday 
firstDayOfTheWeek = [calendar dateFromComponents:comps]; 
[comps setWeekday:7]; // 7: saturday 
lastDayOfTheWeek = [calendar dateFromComponents:comps]; 
+3

मेरा दिन बनाया, यह जवाब स्वीकार किया जाना चाहिए। –

+3

यह समाधान था। यदि आपको अभी भी कुछ समस्या है और NSDayCalendarUnit का उपयोग किया जाता है तो उसे निकालने का प्रयास करें। – altosh

+0

आपको "NSYearForWeekOfYearCalendarUnit" की आवश्यकता क्यों है? यह क्या करता है? – shim

1

नीचे भी बढ़त मामले को शामिल किया गया,

- (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]; 
} 
1

स्विफ्ट समाधान (धन्यवाद @YvesJusot):

let calendar = NSCalendar.currentCalendar() 
let comps = calendar.components(NSCalendarUnit.WeekOfYearCalendarUnit|NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.WeekCalendarUnit|NSCalendarUnit.WeekdayCalendarUnit, fromDate: NSDate()) as NSDateComponents 

comps.setValue(2, forComponent: NSCalendarUnit.WeekdayCalendarUnit) 
let monday = calendar.dateFromComponents(comps)! 

println("\(monday)") 
0

मैं @JasonGarrett में कुछ बदलाव किया जवाब और यह मेरे लिए काम करता है।

let calendar = NSCalendar.currentCalendar() 
let flags : NSCalendarUnit = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear 
let comps = calendar.components(flags, fromDate: NSDate()) as NSDateComponents 
       comps.setValue(2, forComponent: NSCalendarUnit.CalendarUnitWeekday) 
let monday = calendar.dateFromComponents(comps)! 
1

आप सोमवार के रूप में हार्डकोडिंग 2 की बजाय गतिशील मानों का उपयोग करने का मानते हैं!

NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]]; 

comps.weekday = calendar.firstWeekday; 
firstDayOfTheWeek = [calendar dateFromComponents:comps]; 
comps.weekday = calendar.firstWeekday - 1; 
lastDayOfTheWeek = [calendar dateFromComponents:comps]; 
0
// Make these two methods as categories to NSDate 
// Use This to get First date of the week (Monday) 

- (NSDate *) getFirstDayOfWeek { 

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    NSDateComponents *compOfDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday) fromDate:self]; 

    NSInteger numOfDaysToAdd = compOfDate.weekday == 1 ? -6 : (2 - compOfDate.weekday); 

    NSDateComponents *compToAdd = [[NSDateComponents alloc] init]; 

    compToAdd.day = numOfDaysToAdd; 

    return [calendar dateByAddingComponents:compToAdd toDate:self options:0]; 
} 

// Use This to get last date of the week (Sunday) 

- (NSDate *)getLastDayOfWeek { 

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    NSDateComponents *compOfDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday) fromDate:self]; 

    NSInteger numOfDaysToAdd = compOfDate.weekday == 1 ? 0 : (8 - compOfDate.weekday); 

    NSDateComponents *compToAdd = [[NSDateComponents alloc] init]; 

    compToAdd.day = numOfDaysToAdd; 

    return [calendar dateByAddingComponents:compToAdd toDate:self options:0]; 
} 
संबंधित मुद्दे