NSDateFormatter 和 NSDateComponents 为周数返回不同的值
Posted
技术标签:
【中文标题】NSDateFormatter 和 NSDateComponents 为周数返回不同的值【英文标题】:NSDateFormatter and NSDateComponents return different values for the week number 【发布时间】:2016-08-09 15:44:31 【问题描述】:我正在制作一个创建时间表的应用程序。您可以在一年中的每周创建一个新的。当应用程序完成加载后,需要加载当前周(例如:如果是 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 是错误的。是什么导致了这两者之间的差异?
【问题讨论】:
尝试将语言环境和时区设置为日期格式化程序,然后再次调试。 不要问我为什么,但是使用NSCalendar *calendar = [NSCalendar currentCalendar]
,它可以工作(我有一个公历),但是使用你的 alloc/init,我遇到了同样的问题。似乎在某处缺少设置。如果我设置[calendar setLocale:[NSLocale currentLocale]];
,它可以工作。
我同意,您的时区、区域设置和日历似乎不匹配。
【参考方案1】:
不要使用NSDateFormatter
,使用NSCalendar
,这样更准确。
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
【讨论】:
以上是关于NSDateFormatter 和 NSDateComponents 为周数返回不同的值的主要内容,如果未能解决你的问题,请参考以下文章
NSDateFormatter 和 NSDateComponents 的输出 NSDate 之间的区别
NSDateFormatter 和 NSDateComponents 为周数返回不同的值