NSDateFormatter和NSDateComponents为周数

时间:2016-08-09 15:44:31

标签: ios objective-c nsdateformatter nsdatecomponents

我正在创建一个创建时间表的应用。您可以在一年中的每个星期创建一个新的。当应用程序加载完毕后,需要加载当前周(例如:如果是1月1日,则需要显示第1周)。我使用NSDateFormatter来确定当前周是什么。

NSDateFormatter

(我在2016年8月9日对此进行了测试)

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"ww"];

int currentWeek = [[time stringFromDate:[NSDate date]] intValue];

我想检查它是否正常工作,所以我使用了NSLog。

NSLog(@"%i", currentWeek);

它返回了32

NSDateComponents

因此NSDateFormatter认为当前周是32。到现在为止还挺好。应用程序需要发送推送通知,告诉用户某个时间段即将开始。因此,应用程序使用NSDateComponents安排通知。

// Setting the notification's fire date.
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setWeekday:3];  // Because it's on a Tuesday
[dateComps setWeekOfYear:currentWeek];  // 32
[dateComps setYear:2016];
[dateComps setHour:12];
[dateComps setMinute:20];
NSDate *theFireDate = [calendar dateFromComponents:dateComps];

// Creates the notification.
UILocalNotification *Alert = [[UILocalNotification alloc] init];
Alert.timeZone = [NSTimeZone defaultTimeZone];
Alert.alertBody = @"This is a message!";
Alert.fireDate = theFireDate;
[[UIApplication sharedApplication] scheduleLocalNotification:Alert];

我也使用了NSLog。

NSLog(@"%@", theFireDate);

但它返回2016-08-02 12:20:00 +0000,这不是当前日期。它实际上是当前日期减去7天,或一周前。那么这是否意味着当前周实际上是33而不是32,这意味着NSDateFormatter是错误的?或者它实际上是32,这意味着NSDateComponents是错误的。是什么导致了这两者之间的差异?

1 个答案:

答案 0 :(得分:2)

请勿使用NSDateFormatter,请使用更准确的NSCalendar

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];