使用一年中的一周检查 NSDate 是否在当前周
Check whether a NSDate is in current week using week of year
我想检查 NSDate 是否与今天在同一周。因此,我考虑 NSDateComponents
中的 weekOfYear
s,就像 post.
中提到的那样
- (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(星期一),但不幸的是没有成功。
更新
我也试过这段代码,但不幸的是结果相同:
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
这是对 Sneak 代码的非常轻微的修改...调用它:
//
// 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;
}
我想检查 NSDate 是否与今天在同一周。因此,我考虑 NSDateComponents
中的 weekOfYear
s,就像 post.
- (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(星期一),但不幸的是没有成功。
更新
我也试过这段代码,但不幸的是结果相同:
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
这是对 Sneak 代码的非常轻微的修改...调用它:
//
// 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;
}