2011-03-18 19 views
13

Merhaba Bir firstWeekDay ayarı ile ilgili bir sorun, burada benim yaptığım:NSDateComponents ile haftanın ilk gününü Alma: Değişen yıl

Cumartesi 2011-01-01 targetDate, firstWeekDay ise
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:targetDate]; 
[comp setWeekday:2]; 

NSDate *firstWeekDay = [gregorian dateFromComponents:comp]; 

takvimimde Pazartesi 2011-12-26, ancak aslında Pazartesi 2010-12-26 olmalıdır. Bunu nasıl doğru yapabilirim?

+0

bu iOS'deki çalar saat 2011-01-01 bazı kullanıcılar için düzgün çalışmadı nedeni muhtemelen mı? – Felix

cevap

1

bu çözüm haftanın ilk günü Pazartesi varsayar bu

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

Not deneyin.

+0

Teşekkürler, ancak yönteminiz çalışmıyor. firstWeekDay şimdi oldu 2011-12-20 – Roman

+0

Evet, benim için çalışıyor. –

35

Bu sorunu gidermek için, NSDateComponents öğesinde NSYearForWeekOfYearCalendarUnit ekleyin.

Örnek:

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

Günümü yaptım, bu cevap kabul edilmeli. –

+3

Bu çözüm oldu. Hala bir sorun yaşıyorsanız ve NSDayCalendarUnit kullandıysanız onu kaldırmayı deneyin. – altosh

+0

Neden "NSYearForWeekOfYearCalendarUnit" dosyasına ihtiyacınız var? Bu ne işe yarıyor? – shim

1

aynı zamanda kenar durum kapak altında,

- (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

Swift çözeltisi (sayesinde @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

I @JasonGarrett bazı değişiklikler yaptığı cevap ver ve benim için çalışıyor.

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

Pazartesi günkü kodlama 2 yerine dinamik değerler kullanacağınızı varsayalım!

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]; 
} 
İlgili konular