查找依赖于区域设置的第一天

时间:2014-05-15 03:48:52

标签: ios objective-c cocoa-touch nsdate nsdatecomponents

给定NSDate,如何根据用户的区域设置找到该日期的第一天。例如,我听说有些国家将星期一视为一周的第一天,其他国家则使用星期日。我需要在第一种情况下返回前一个星期一,而在后一种情况下返回前一个星期日。

到目前为止,我的最大努力始终返回前一个星期日,无论应用何种设备设置:

NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setLocale:[NSLocale currentLocale]];
NSDateComponents *components = [calendar components:NSYearForWeekOfYearCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:originalDate];
[components setWeekday:1];
NSDate *firstDayOfWeek = [calendar dateFromComponents:components];

奖金问题:在iOS上,哪个设置驱动了这个?它是'地区格式'吗?

2 个答案:

答案 0 :(得分:5)

尝试更改:

[components setWeekday:1];

为:

[components setWeekday:[calendar firstWeekday]];

您还应该删除NSYearForWeekOfYearCalendarUnitNSWeekCalendarUnit组件。

奖金问题:“地区格式”应该是更改一周中第一天的设置。

答案 1 :(得分:0)

对于那些不想首先设置日历的人来说,这是一种更为智能的旧方式。

NSDate *date = [NSDate dateWithTimeIntervalSince1970:1483620311.228]; 
NSLog(@"current date ===> : %@", date);
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *previousMonday = [calendar nextDateAfterDate:date 
                                    matchingUnit:NSCalendarUnitWeekday  
                                           value:2 //use 1-7 for Sunday to Saturday week day.
                                         options:NSCalendarMatchNextTime | NSCalendarSearchBackwards];
NSLog(@"previousMonday date ===> : %@", previousMonday);