【问题标题】:NSCalendar NSDateComponents weekofYear return 1 with date 2014-12-31NSCalendar NSDateComponents weekofYear 返回 1,日期为 2014-12-31
【发布时间】:2014-12-31 03:20:23
【问题描述】:

我想得到日期为 '2014-12-31' 的 weekofYear ,但它总是返回 1 而不是 52 这是我的代码:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:[NSDate date]];

NSlog(@"%i",dateComponent.weekOfYear);


output  "1";

我知道结果是正确的,但我想得到“52”而不是“1”,如何解决?

【问题讨论】:

  • 大概 2015 年的第一周是包含 2015 年 1 月 1 日的那一周。(尽管这种行为没有得到很好的记录。)

标签: objective-c nscalendar nsdatecomponents


【解决方案1】:

另一种方法是使用NSDateComponents 实例的yearForWeekOfYear 属性。如果yearForWeekOfYear 是在传递给components:fromDate: 的日期的年份之后,那么它是第52 周。

例如

NSCalendar *calendar = [NSCalendar currentCalendar];

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSYearForWeekOfYearCalendarUnit;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:[NSDate date]];

NSInteger weekOfYear = dateComponent.weekOfYear;
if (dateComponent.yearForWeekOfYear > dateComponent.year)
    weekOfYear = 52;
NSLog(@"%i",weekOfYear); // 52

【讨论】:

【解决方案2】:

在获取日期组件之前设置NSCalendar实例的minimumDaysInFirstWeek属性。

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.minimumDaysInFirstWeek = 7; // the week has to be completely within one year

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:[NSDate date]];

NSLog(@"%i",dateComponent.weekOfYear); // 52

【讨论】:

  • 但这也将使 2015-1-1 第 52 周。
【解决方案3】:

如果周为 1(2015 年的第一天或 2014 年的最后几天)

并且这一天大于 20(所以它是 2014 年的最后三天之一)

THEN(计算您约会的星期减去 5 天,然后加 1)。

这将使一年中的最后几天成为他们自己的一周,有时是第 52 周,有时是第 53 周。它适用于欧洲和美国的日历。

如果 1 月 1 日是上一年的最后一周,您需要考虑要做什么。可能会在第 0 周完成。因此,真正遵循标准并接受 iOS 告诉您的内容是更明智的做法。

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多