2 NSDateComponents - 是同一周吗?
Posted
技术标签:
【中文标题】2 NSDateComponents - 是同一周吗?【英文标题】:2 NSDateComponents - is it same week? 【发布时间】:2010-08-25 12:13:16 【问题描述】:我有一个带有 BOOL 返回值和 2 个输入 (NSDateComponents *) 参数的函数。 我的麻烦是我有两个 NSDateComponents 值,我想知道这两个日期是否在同一个日历周内。我尝试了最简单的解决方案来解决问题,我的想法如下:
- (BOOL)isFunctionName:(NSDateComponents *)comp1 andParam:(NSDateComponents *)comp2
return (([comp1 week] == [comp2 week]) && ([comp1 year] == [comp2 year]));
但这是不正确的。 有什么办法可以解决?
编辑
所以我有一个从日期生成日期组件的函数。
-(NSDateComponents *)dateToDateComponents:(NSDate *)date
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date];
[gregorian release];
return dateComponents;
我这样称呼它:
if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]])
在我的测试期间,它返回 YES 我的所有日期(例如 2010.07.21 - 2010.08.18)
【问题讨论】:
【参考方案1】:这受到罗伯特的回答的启发。当一周超过两年时,我对其进行了一些调整以解决该问题,例如2012 年 12 月 31 日和 2013 年 1 月 1 日。
- (BOOL)isOnSameWeekAsDate:(NSDate*)otherDate
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
unsigned unitFlags = NSCalendarUnitYearForWeekOfYear | NSCalendarUnitWeekOfYear;
NSDateComponents *components = [calendar components:unitFlags fromDate:self];
NSDateComponents *otherComponents = [calendar components:unitFlags fromDate:otherDate];
return ( [components yearForWeekOfYear] == [otherComponents yearForWeekOfYear] && [components weekOfYear] == [otherComponents weekOfYear] );
【讨论】:
我认为这就是答案。我在网络上的其他地方没有找到它。不过,您使用的常量已被弃用。 您的答案在 ios8 中不再有用...见nshipster.com/nscalendar-additions 在iOS7等之前保留它...我试图为isOnPreviousWeek
找到一个解决方案...你能轻松做到吗?【参考方案2】:
NSDateComponent 类引用状态:
重要提示:
NSDateComponents
对象本身没有意义;你 需要知道它是什么日历 解释反对,你需要 知道这些值是否是绝对的 单位或数量的值 单位。
比较NSDate
s 怎么样?
- (BOOL) weekIsEqual:(NSDate *)date and:(NSDate *)otherDate
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *dateComponents = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:date];
NSDateComponents *otherDateComponents = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:otherDate];
return [dateComponents week] == [otherDateComponents week] && [dateComponents year] == [otherDateComponents year];
编辑: 在这一行:
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
你没有通过NSWeekCalendarUnit
,因此[dateComponent week]
返回NSUndefinedDateComponent
编辑
当然,必须是NSWeekCalendarUnit
...
【讨论】:
我调用我的函数如下: if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]) 有 dateToDateComponents 函数,它使 DateComponents 从日期无符号 unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date]; [格里高利发行];返回日期组件; 所以这是两个日期,我想处理它们。 好的,我明白了,添加了 NSWeekdayCalendarUnit,然后我在 NSLog(@"comp1 week: %@" [comp1 week]) 之后得到了 EXC_BAD_ACCES :S [comp1 week] 返回一个 NSInteger,如果你使用例如NSLog(@"%@", 34), 34 将被取消引用,就好像它是一个会导致错误访问信号的指针。试试 NSLog(@"comp1 week: %i", [comp1 week]);而是【参考方案3】:从 iOS8 开始,这变得容易多了:
-(BOOL)isDate:(NSDate *)date1 onSameWeekAs:(NSDate *)date2
return [[NSCalendar currentCalendar] isDate:date1
equalToDate:date2
toUnitGranularity:NSCalendarUnitWeekOfYear];
来自documentation:
如果两个日期对于所有单位都具有相同的日期部分,则返回 YES 大于或等于给定单位,否则为否。
【讨论】:
以上是关于2 NSDateComponents - 是同一周吗?的主要内容,如果未能解决你的问题,请参考以下文章
NSDateComponents weekOfYear 返回错误的日期
NSDateFormatter 和 NSDateComponents 为周数返回不同的值