質問

特定の年のObjective-CのCalendarWeeksの数を計算する方法。

私は試してみました:

[calendar rangeOfUnit:NSWeekOfYearCalendarUnit inUnit: NSYearCalendarUnit forDate: [NSDate date]].length
.

しかしそれは54を返します。

ありがとう

役に立ちましたか?

解決

NSWeekOfYearCalendarUnitを使用しているので、NSYearForWeekOfYearCalendarUnitである対応する大きい単位を使用する必要があります。

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.firstWeekday = 2;
calendar.minimumDaysInFirstWeek = 4;
int n = [calendar rangeOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearForWeekOfYearCalendarUnit forDate: [NSDate date]].length;
NSLog(@"%d", n); // 52
.

最後に、NSWeekOfYearCalendarUnitNSYearForWeekOfYearCalendarUnitの両方がiOS 5.0およびOS X 10.7のみです。

編集

@Lnafzigerによって指摘されているように、前年度または2016年1月1日などの来年の暦週の日付を使用する場合、これはその年の週数を計算します(例の2015)、実際の日付(例の2016年)ではありません。これがあなたが望むものではない場合、あなたは次のような日付を変更することができます:

NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:date];
components.month = 3;
date = [calendar dateFromComponents:components];
.

他のヒント

かなりの量のテストの後、ここで任意の年の間それを返す関数があります:

- (NSUInteger)iso8601WeeksForYear:(NSUInteger)year {
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *firstThursdayOfYearComponents = [[NSDateComponents alloc] init];
    [firstThursdayOfYearComponents setWeekday:5]; // Thursday
    [firstThursdayOfYearComponents setWeekdayOrdinal:1]; // The first Thursday of the month
    [firstThursdayOfYearComponents setMonth:1]; // January
    [firstThursdayOfYearComponents setYear:year];
    NSDate *firstThursday = [calendar dateFromComponents:firstThursdayOfYearComponents];

    NSDateComponents *lastDayOfYearComponents = [[NSDateComponents alloc] init];
    [lastDayOfYearComponents setDay:31];
    [lastDayOfYearComponents setMonth:12];
    [lastDayOfYearComponents setYear:year];
    NSDate *lastDayOfYear = [calendar dateFromComponents:lastDayOfYearComponents];

    NSDateComponents *result = [calendar components:NSWeekCalendarUnit fromDate:firstThursday toDate:lastDayOfYear options:0];

    return result.week + 1;
}
.

基本的に、仕様ごとに、合計週数は年間の木曜日の総数と同じです。これはこれが計算されているものです。

私は400年のサイクル全体でそれをテストしました(2000年から2000年までに)、すべてのケースは仕様と一致します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top