检查一个NSDate是否在本周使用当周
我想检查一个NSDate是否与今天在同一周。所以我认为weekOfYear
从NSDateComponents
s就像这post中提到的。检查一个NSDate是否在本周使用当周
- (BOOL)dateIsThisWeek:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
[cal setFirstWeekday: 2]; // Added in second try
NSDate *today = [NSDate date];
NSDateComponents *todaysComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: today];
NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSDateComponents *otherComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: date];
NSUInteger anotherWeek = [otherComponents weekOfYear];
return todaysWeek == anotherWeek; // todaysWeek=7 | anotherWeek=8
}
在我的例子中,我的日期如下:
today: 2017-02-15 12:00:00 +0000
date: 2017-02-18 12:00:00 +0000
的问题是,todaysWeek
被设定为7和anotherWeek
〜8,我不能想象为什么。
我认为这个问题可能是,该周开始在周日,所以我的日历的首个工作日设置为2(星期一),可惜没有成功。
UPDATE
我也试过这个代码,但不幸的是同样的结果:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate: date];
NSUInteger datesWeek = [otherComponents weekOfYear];
return todaysWeek==datesWeek; // todaysWeek=7 | datesWeek=8
两个日期应该是在一周7号一样多websites的描述。
试试这个也许? (从我自己的项目代码复制)
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
[gregorianCalendar setLocale:[NSLocale localeWithLocaleIdentifier:@"be_NL"]];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:19];
[comps setMonth:02];
[comps setYear:2017];
NSDate *date = [gregorianCalendar dateFromComponents:comps];
//NSCalendar *cal = [NSCalendar currentCalendar];
//[gregorianCalendar setFirstWeekday:2]; // Added in second try
NSDate *today = [NSDate date];
NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: today];
//[todaysComponents setWeekdayOrdinal:2];
NSDateComponents *otherComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: date];
//[otherComponents setWeekdayOrdinal:2];
// Not sure if needed to set timezone too depending on your local time, but you can set this for all dates if needed
//[otherComponents setTimeZone:[NSTimeZone localTimeZone]];
NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSUInteger anotherWeek = [otherComponents weekOfYear];
NSLog(@"todays week %ld",(long)todaysWeek);
NSLog(@"anotherWeek %ld",(long)anotherWeek);
打印出:
2017-02-17 03:51:58.231797 Sneak[5518:2676264] todays week 7
2017-02-17 03:51:58.231836 Sneak[5518:2676264] anotherWeek 7
编辑:(正如在评论部分下面提到)
周一是本星期的第一天达到国际标准ISO 8601,但在美国,加拿大和日本,它算作一周的第二天。星期一是在星期天之前和星期二之前在我们现代的格里历日历中。 - timeanddate.com/calendar/days/monday.html希望 “be_NL” 永不开关 - DonMag
谢谢抱歉。我刚刚复制了你的代码,现在它正在工作。我无法想象为什么我总是得到第8周的原因。编辑:第一个解决方案已经足够,但第二个解决方案也很好。谢谢:) – user3191334
@ user3191334 NP,你可以使用它。不要忘记接受我的社区答案:) – 2017-02-15 14:19:26
你们*确定*这是做你想做的?如果我理解正确,@ user3191334希望2月19日星期日与今天,星期三,2月15日在同一周。使用上面的代码,您将比较日期设置为星期六,18,并获得7和7周。 ..如果你用'[comps setDay:19]'运行它,你会得到第7和第8周。或者? – DonMag
这是一个非常轻微修改潜行的代码......与调用它:
//
// startDayOfWeek: Sunday == 1, Monday == 2, Tues == 3, etc
Bool b = [self dateIsThisWeek:date startDayOfWeek:2];
- (BOOL)dateIsThisWeek:(NSDate *)dateToTest startDayOfWeek:(NSInteger)iStart {
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// this is the key - 1 == week runs Sunday-Saturday, 2 == Monday-Sunday, 3 == Tues-Mon, etc
[gregorianCalendar setFirstWeekday:iStart];
NSDate *today = [NSDate date];
NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: today];
NSInteger todaysWeek = [todaysComponents weekOfYear];
NSDateComponents *testComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: dateToTest];
NSInteger testsWeek = [testComponents weekOfYear];
return todaysWeek == testsWeek;
}
你如何定义一个“周”?它是当前的“命名周” - 即从上个星期天开始?从上周一开始?连续7天是一周吗?那么,如果1月1日是星期四,那么1月6日星期二仍然是第一个“星期”? – DonMag
的可能的复制[如何检查是否NSDate的是在本周?](http://*.com/questions/38970836/how-to-check-if-nsdate-is-in-current-week) – 2017-02-15 13:46:34
@DonMag在我看来,一周是周一到周日,就像这个例子:http://week-number.net/calendar-with-week-numbers-2017.html – user3191334