【问题标题】:Check whether a NSDate is in current week using week of year使用一年中的一周检查 NSDate 是否在当前周
【发布时间】:2017-02-15 13:40:15
【问题描述】:

我想检查 NSDate 是否与今天在同一周。因此,我认为 weekOfYears 来自 NSDateComponents,就像 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 所描述的那样。

【问题讨论】:

  • 如何定义“一周”?是否是当前的“指定周”——即从上周日开始?从上周一开始?一周是连续7天吗?那么,如果 1 月 1 日是星期四,那么 1 月 6 日星期二仍然是第一个“周”?
  • @DonMag 在我看来一周是从周一到周日,就像在这个例子中一样:week-number.net/calendar-with-week-numbers-2017.html
  • @Sneak 不幸的是,您的建议并没有解决我的问题。使用帖子中标记为已解决的代码,返回相同的星期数,7 和 8。
  • @user3191334 我不知道是什么问题,今天的本周是7,下周是8,你可以看到epochconverter.com/weeknumbers你也应该检查这个问题也许对你有帮助path ,但我不明白阅读您的问题到底是什么问题:stackoverflow.com/questions/16875420/…

标签: ios objective-c nscalendar


【解决方案1】:

试试这个可以吗? (复制自我自己的项目代码)

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 希望 2 月 19 日星期日与今天 2 月 15 日星期三在同一周。使用上面的代码,您将比较日期设置为 18 日星期六,您将获得第 7 周和第 7 周。 .. 如果您使用[comps setDay:19] 运行它,您将获得第 7 周和第 8 周。或者?
  • @user3191334 你觉得这让你失望了?检查我更新的答案:)
  • @Sneak Ahhh 设置语言环境很有效!非常感谢!
  • 根据国际标准 ISO 8601,星期一是一周的第一天,但​​在美国、加拿大和日本,它被视为一周的第二天。在我们的现代公历中,星期一在星期日之后和星期二之前。 - timeanddate.com/calendar/days/monday.html希望“be_NL”永远不会切换:)
【解决方案2】:

这是对 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多