Ios 获取一年中某周的日期

Ios 获取一年中某周的日期,ios,objective-c,date,nsdateformatter,nsdatecomponents,Ios,Objective C,Date,Nsdateformatter,Nsdatecomponents,我想从编号中获取一周的开始日期,代码如下: + (NSDate *)dateOfWeek:(NSInteger)weekOfYear year:(NSInteger)year { NSCalendar *calendar = [NSCalendar currentCalendar]; [calendar setFirstWeekday:2]; // monday calendar.minimumDaysInFirstWeek = 4; // iso 8601

我想从编号中获取一周的开始日期,代码如下:

+ (NSDate *)dateOfWeek:(NSInteger)weekOfYear year:(NSInteger)year {

    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setFirstWeekday:2]; // monday
    calendar.minimumDaysInFirstWeek = 4; // iso 8601

    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.year = year;
    components.weekOfYear = weekOfYear;
    [components setWeekday:2]; // monday

    NSDate *date = [calendar dateFromComponents:components];

    return date;
}
如果年份=2017且周数=52(或其他有效数字),则日期正确:

2017-12-24 21:00:00 +0000
如果year=2018且weekOfYear=2日期也正确:

2018-01-07 21:00:00 +0000
但如果年份=2018且周数=1日期不正确:

2018-12-30 21:00:00 +0000
它必须是2017-12-31 21:00:00+0000


使用NSDateFormatter获取日期还有第二种方法:

NSString    *dateString = [NSString stringWithFormat:@"%li %li", (long)year, (long)weekOfYear];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy ww";

NSDate *date = [dateFormatter dateFromString:dateString];

NSLog(@"%@", [date description]);
但它在2018年和1年的情况下也存在同样的问题



我是怎么搞错日期的?或者这是基础bug?< /P> < P>这不是基础bug。

您需要组件
yearForWeekOfYear
来获得正确的一年中的一周:

components.yearForWeekOfYear = year;
日期格式化程序问题实际上是相同的,yearForWeekOfYear说明符是
Y

dateFormatter.dateFormat = @"YYYY ww";

<>这不是一个基础错误。< /P> 您需要组件
yearForWeekOfYear
来获得正确的一年中的一周:

components.yearForWeekOfYear = year;
日期格式化程序问题实际上是相同的,yearForWeekOfYear说明符是
Y

dateFormatter.dateFormat = @"YYYY ww";

谢谢你,你让我度过了这一天:)但这并不是用NSDateFormatter的方式解决同样的问题…“ISO 8601对第01周的定义是公历年的第一个星期四所在的一周。”--这就是我们应该使用
yearForWeekOfYear
,只是在新年的第一周在我的应用程序中发现了这个错误:)谢谢,你创造了我的一天:)但这并不能用NSDateFormatter的方式解决同样的问题……”ISO 8601对第01周的定义是公历年的第一个星期四所在的一周。”--这就是我们应该使用
yearForWeekOfYear
,只是在新年的第一周在我的应用程序中发现了这个错误:)