2015-10-11 36 views
1

我希望每个人都能获得特定区域设置的本周第一天。例如,在美国的一周,星期一从周日开始,其他国家开始。获取objective-c中的第一天和最后一天

我想在每个人的星期一开始,这是因为我想用这个SQLQuery。

我有这样的:

NSDate *weekDay = [NSDate date]; //any date in the week in which to calculate the first or last weekday 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:weekDay]; 
[components setDay:([components day]-([components weekday]-[[NSCalendar currentCalendar] firstWeekday]))]; 

NSDate *firstWeekday = [gregorian dateFromComponents:components]; 
NSDate *lastWeekday = [[gregorian dateFromComponents:components] dateByAddingTimeInterval:7 * 24 * 3600 - 1]; 
NSLog(@"first - %@ \nlast - %@", firstWeekday, lastWeekday); 

如果您所在区域本周星期一开始,但如果与周日开始不回我想要什么,工作正常。

所以,想象今天是2015年10月11日 星期日区域将返回星期11,最后一天的第一天,17 随着周一区域将返回5日当周的第一天,最后一天11

我想在我的应用程序执行的任何地方返回第二个选项。

谢谢。 此致敬礼。

+0

作为一个英国人的第一天,我一周上周一开始... – Wain

+0

更新,影响到美国的,但问题是相同... – Miguel

+0

您是否尝试将日历的语言环境设置为systemLocale或设置firstWeekday? – Willeke

回答

5
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

cal.firstWeekday = 2;// set first week day to Monday 
// 1: Sunday, 2: Monday, ..., 7:Saturday 

NSDate *now = [NSDate date]; 
NSDate *startOfTheWeek; 
NSDate *endOfWeek; 
NSTimeInterval interval; 
[cal rangeOfUnit:NSCalendarUnitWeekOfYear 
     startDate:&startOfTheWeek 
     interval:&interval 
     forDate:now]; 
//startOfTheWeek holds the beginning of the week 

endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval - 1]; 
// endOfWeek now holds the last second of the last week day 

[cal rangeOfUnit:NSCalendarUnitDay 
     startDate:&endOfWeek 
     interval:NULL 
     forDate:endOfWeek]; 
// endOfWeek now holds the beginning of the last week day 

测试:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.dateStyle = NSDateFormatterShortStyle; 
formatter.timeStyle = NSDateFormatterShortStyle; 

NSLog(@"start: %@", [formatter stringFromDate:startOfTheWeek]); 
NSLog(@"end: %@", [formatter stringFromDate:endOfWeek]); 

打印

start: 12.10.15, 00:00 
end: 18.10.15, 00:00 

因此周一是一周

如果我设置

的开始
cal.firstWeekday = 1; 

将打印

start: 11.10.15, 00:00 
end: 17.10.15, 00:00 

星期日是一周

+0

嗨: 非常感谢,但不幸的是,如果今天是星期天11,并且你执行了你的代码,那么系统返回的结果是一周中的第一天是星期日11,而不是星期一5 – Miguel

+0

当然,这不是一个到期的时区问题打印它?例如: – vikingosegundo

+0

:我在GMT + 2,它是1:12。因为这是格林威治标准时间,因此在本周开始我会得到'2015-10-11 22:00:00 + 0000'。如果我添加2小时,它是'2015-10-12 00:00:00' – vikingosegundo

相关问题