Ios 获取第一个和最后一个工作日。一年中第一周和最后一周的奇怪行为
我想获得给定年份的给定星期(数字)的第一天和最后一天。 我写的函数在一年的最后一周和第一周都有效 例如,如果我要的是Ios 获取第一个和最后一个工作日。一年中第一周和最后一周的奇怪行为,ios,objective-c,cocoa-touch,nsdate,Ios,Objective C,Cocoa Touch,Nsdate,我想获得给定年份的给定星期(数字)的第一天和最后一天。 我写的函数在一年的最后一周和第一周都有效 例如,如果我要的是年2014年的周的工作日1和7,我就得到了2015年的第一周 2014-12-28 // weekday 1 2015-01-03 // weekday 7 但正确的结果应该是 2013-12-29 // weekday 1 2014-01-04 // weekday 7 如果我要求2013年第51周,我正确收到: 2013-12-15 // weekday 1 201
年2014年的周的工作日1和7,我就得到了2015年的第一周
2014-12-28 // weekday 1
2015-01-03 // weekday 7
但正确的结果应该是
2013-12-29 // weekday 1
2014-01-04 // weekday 7
如果我要求2013年第51周,我正确收到:
2013-12-15 // weekday 1
2013-12-21 // weekday 7
这里是我的函数,我如何修复这种奇怪的行为
// Return the date which is the weekday for a given week number and year
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{
// Date component
NSDateComponents *comp = [[NSDateComponents alloc]init];
[comp setWeekOfYear:week];
[comp setWeekday:weekday];
[comp setYear:year];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:comp];
NSLog(@"week %d year %d weekday %d\n%@", week, year, weekday, date);
return date;
}
编辑-------------
在@Guillaume回答之后,我使用setWeekOfYear
而不是setYear
修改了我的代码。它部分起作用了,我正确地得到了一周的最后一天,但作为第一个工作日,我得到了下一周的第一天。现在我得到了这个错误与任何星期数,不仅是第一或最后一年
以下是2014年第1周的新结果:
2014-01-05 // weekday1... it should be 2013-12-29. damn!
2014-01-04 // weekday7... it should be 2014-01-04. great!
正如信息一样,我使用以下代码调用我的分类函数:
self.fromDate = [NSDate weekDay:1 forWeekOfYear:self.selectedWeek year:self.selectedYear];
self.toDate = [NSDate weekDay:7 forWeekOfYear:self.selectedWeek year:self.selectedYear];
您正在创建错误的日历对象
通过以下方式创建它:
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
您是否尝试了setYearForWeekOfYear:
而不是setYear:
在NSCalendar
中还有一个属性minimumDaysInFirstWeek
,可能值得一看……您已经解决了吗
尝试:
我得到这个结果
2013-12-18 14:57:48.090 datecal[20740:303] week 1 year 2014 weekday 1 29/12/2013 00:00:00
2013-12-18 14:57:48.091 datecal[20740:303] week 1 year 2014 weekday 7 04/01/2014 00:00:00
对于此代码(星期日一周的第一天):
到
及
到
如果你把它混在一起
calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
你会在编辑中看到你描述的行为,因为很明显,你的日历以周一为一周的开始,你会填写周日和周六吗
如果要尊重用户的区域设置,可以执行以下操作:
@interface NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year;
@end
@implementation NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{
NSDateComponents *comp = [[NSDateComponents alloc]init];
[comp setWeekOfYear:week];
[comp setWeekday:weekday];
[comp setYearForWeekOfYear:year];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:comp];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"yyyy-MM-dd HH:mm:ss"
options:0
locale:[NSLocale currentLocale]]];
NSLog(@"week %ld year %ld weekday %ld %@", (long)week, (long)year, (long)weekday, [formatter stringFromDate:date]);
return date;
}
@end
-(void)method
{
static NSUInteger SUNDAY = 1;
static NSUInteger MONDAY = 2;
static NSUInteger SATURDAY = 7;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *fromDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? MONDAY : SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? SUNDAY : SATURDAY forWeekOfYear:1 year:2014];
}
我仍然收到奇怪的结果:`2015-01-04//weekday1``2015-01-03//weekday7`您是否尝试过setYearForWeekOfYear。我试着用它代替了setYear。你正在目睹的行为在WWDC 2011视频中有介绍。你应该看,太好了!我马上就看
calendar.firstWeekday = SUNDAY;
calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
NSDate *fromDate = [NSDate weekDay:MONDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
@interface NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year;
@end
@implementation NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{
NSDateComponents *comp = [[NSDateComponents alloc]init];
[comp setWeekOfYear:week];
[comp setWeekday:weekday];
[comp setYearForWeekOfYear:year];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:comp];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"yyyy-MM-dd HH:mm:ss"
options:0
locale:[NSLocale currentLocale]]];
NSLog(@"week %ld year %ld weekday %ld %@", (long)week, (long)year, (long)weekday, [formatter stringFromDate:date]);
return date;
}
@end
-(void)method
{
static NSUInteger SUNDAY = 1;
static NSUInteger MONDAY = 2;
static NSUInteger SATURDAY = 7;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *fromDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? MONDAY : SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? SUNDAY : SATURDAY forWeekOfYear:1 year:2014];
}