【问题标题】:When system calendar is on a sunday, NSCalendar thinks it's a new week当系统日历是星期天时,NSCalendar 认为是新的一周
【发布时间】:2014-09-22 20:47:39
【问题描述】:

当我的系统日历设置为星期天时,下面的代码认为这是新的一周,并整天显示下周。 例如 这周是第 39 周。 在 9 月 28 日星期日,我的代码认为这是新的一周,并显示下周(第 40 周)的所有天数,而不是我想要的第 39 周。 (我住的一周是从周一到周日而不是周日到周六)

NSDate *currentDate = [NSDate date];
NSCalendar *myCalendar = [NSCalendar currentCalendar];

[myCalendar setLocale:[NSLocale systemLocale]];

    NSDateComponents *currentComps = [myCalendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:currentDate];
int thisWeeksNumber = currentComps.weekOfYear;
NSLog(@"1  %d", thisWeeksNumber);

[myCalendar setFirstWeekday:2];


[currentComps setWeekday:2];
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:3];
NSDate *secondDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:4];
NSDate *thirdDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:5];
NSDate *fourthDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:6];
NSDate *fifthDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:7];
NSDate *sixthDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:1];
NSDate *seventhDayOfTheWeek = [myCalendar dateFromComponents:currentComps];


NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
myDateFormatter.dateFormat = @"yyyy-MM-dd";
NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek];
NSString *secondStr = [myDateFormatter stringFromDate:secondDayOfTheWeek];
NSString *thirdStr = [myDateFormatter stringFromDate:thirdDayOfTheWeek];
NSString *fourthStr = [myDateFormatter stringFromDate:fourthDayOfTheWeek];
NSString *fifthStr = [myDateFormatter stringFromDate:fifthDayOfTheWeek];
NSString *sixthStr = [myDateFormatter stringFromDate:sixthDayOfTheWeek];
NSString *seventhStr = [myDateFormatter stringFromDate:seventhDayOfTheWeek];

NSLog(@"\n %@ \n %@ \n %@ \n %@ \n %@ \n %@ \n %@", firstStr, secondStr, thirdStr, fourthStr, fifthStr, sixthStr, seventhStr);

我的日志显示: 2014-09-21 22:40:36.040 NSCalendarProject[38667:90b] 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26 2014-09-27 2014-09-28

如您所见,我运行它的日期是 9 月 21 日星期日,它显示下一周的所有日子(如果我将日期设置为 9 月 28 日,则相同)

【问题讨论】:

    标签: ios object nsdate nscalendar


    【解决方案1】:

    调用 [myCalendar setFirstWeekday:2] 只会将第一个工作日设置为星期一。但是,星期日仍然是“1”。因此,当 currentDate 是星期日时,“2”指的是该星期日之后的星期一,并且您的代码以下一周的日期结束。

    您真正想要的是获得“currentDate”所在的一周的第一天。这段代码应该可以工作,但我不知道它是否是最优雅的解决方案。

    NSCalendar *myCalendar = [NSCalendar currentCalendar];
    
        //create a 'sunday' date object for demonstration purposes
        NSDateComponents *sundayComponents = [[NSDateComponents alloc]init];
        sundayComponents.day = 28;
        sundayComponents.month = 9;
        sundayComponents.year = 2014;
        NSDate *sunday = [myCalendar dateFromComponents:sundayComponents];
    
        [myCalendar setLocale:[NSLocale systemLocale]];
    
        NSDateComponents *currentComps = [myCalendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSCalendarUnitWeekOfYear|NSWeekdayCalendarUnit fromDate:sunday];
        int thisWeeksNumber = currentComps.weekOfYear;
        NSLog(@"1  %d", thisWeeksNumber);
    
        [myCalendar setFirstWeekday:2];
        NSDate *beginningOfWeek = nil;
        [myCalendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&beginningOfWeek
                       interval:NULL forDate: sunday];
    
    
        NSDateComponents *components = [[NSDateComponents alloc] init];
    
        NSDate *firstDayOfTheWeek = beginningOfWeek;
        components.day = 1;
        NSDate *secondDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
        components.day = 2;
        NSDate *thirdDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
        components.day = 3;
        NSDate *fourthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
        components.day = 4;
        NSDate *fifthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
        components.day = 5;
        NSDate *sixthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
        components.day = 6;
        NSDate *seventhDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0];
    
    
        NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
        myDateFormatter.dateFormat = @"yyyy-MM-dd";
        NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek];
        NSString *secondStr = [myDateFormatter stringFromDate:secondDayOfTheWeek];
        NSString *thirdStr = [myDateFormatter stringFromDate:thirdDayOfTheWeek];
        NSString *fourthStr = [myDateFormatter stringFromDate:fourthDayOfTheWeek];
        NSString *fifthStr = [myDateFormatter stringFromDate:fifthDayOfTheWeek];
        NSString *sixthStr = [myDateFormatter stringFromDate:sixthDayOfTheWeek];
        NSString *seventhStr = [myDateFormatter stringFromDate:seventhDayOfTheWeek];
    
        NSLog(@"\n %@ \n %@ \n %@ \n %@ \n %@ \n %@ \n %@", firstStr, secondStr, thirdStr, fourthStr, fifthStr, sixthStr, seventhStr);
    
        //log first day of week
        NSString *beginningWeek = [myDateFormatter stringFromDate:beginningOfWeek];
        NSLog(@"beginning of week is %@", beginningWeek);
    

    【讨论】:

    • 感谢您的回答!我现在已经解决了这个问题!这只会在 2014 年有效。
    • 不客气,很高兴为您提供帮助。在什么意义上它只在 2014 年有效?当我输入(例如)2015 年 1 月 4 日星期日时,我会得到 2014 年 12 月 22 日星期一到 2015 年 1 月 4 日星期日。这不是正确的行为吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多