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 之间的区别

NSDate NSDateFormatter

使用 NSDateFormatter 管理日期

NSDateFormatter 和 NSDateComponents 为周数返回不同的值

NSDateFormatter 给出不同的输出/错误(GMT?)时间

Foundation框架中的NSDateFormatter