获取第一天一个星期与NSDateComponents:改变今年

问题描述:

你好 我有设置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

这是有可能,为什么在iOS上的闹钟没有正确地为某些用户在工作2011-01-01原因? – Felix 2011-03-18 09:00:40

试试这个

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

注意此解决方案假定一周的第一天是星期一。

+0

谢谢,但你的方法不起作用。 firstWeekDay现在成为2011-12-20 – Roman 2011-03-18 09:17:58

+0

是的,适合我。 – 2013-10-28 03:37:58

要解决此问题,请在NSDateComponents中添加NSYearForWeekOfYearCalendarUnit

例:

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

使我的一天,这应该被接受的答案。 – 2013-02-26 09:27:16

+3

这是解决方案。如果你仍然有一些问题,并使用NSDayCalendarUnit然后尝试删除它。 – altosh 2013-06-14 04:03:19

+0

为什么你需要“NSYearForWeekOfYearCalendarUnit”?它有什么作用? – shim 2013-11-25 14:19:33

下面还覆盖边缘的情况下,

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

雨燕解决方案(感谢@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)") 

我的确在@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)! 

假设在星期一使用动态值而不是硬编码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]; 

// 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]; 
}