NSDateFormatter 和 NSDateComponents return 周数的不同值
NSDateFormatter and NSDateComponents return different values for the week number
我正在制作一个可以创建时间表的应用程序。您可以在一年中的每个星期创建一个新的。应用加载完成后,需要加载当前周(例如:如果是 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 是错误的。是什么导致了这两者之间的差异?
不要使用 NSDateFormatter
,使用更准确的 NSCalendar
。
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
我正在制作一个可以创建时间表的应用程序。您可以在一年中的每个星期创建一个新的。应用加载完成后,需要加载当前周(例如:如果是 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 是错误的。是什么导致了这两者之间的差异?
不要使用 NSDateFormatter
,使用更准确的 NSCalendar
。
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];