特定の年の Objective-C の暦週数を計算するにはどうすればよいですか。
私は試した:
[calendar rangeOfUnit:NSWeekOfYearCalendarUnit inUnit: NSYearCalendarUnit forDate: [NSDate date]].length
しかし、54 を返します。
ありがとう
特定の年の Objective-C の暦週数を計算するにはどうすればよいですか。
私は試した:
[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
NSWeekOfYearCalendarUnit
最後に、とNSYearForWeekOfYearCalendarUnit
は 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 年のサイクル全体 (0 年と 2000 年から開始) でテストしたところ、すべてのケースが仕様に一致しました。