5

1年に何週間ありますか?Webで検索したところ、1年で合計52.1週間あることがわかりましたが、Xcodeでこれを行うと次のようになります。

NSCalendar *gregorian = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];

[gregorian setFirstWeekday:2];

NSDate* sourceDate = [NSDate date];

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* today = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:today];

NSUInteger todaysWeek = [todaysComponents week];

todaysWeekの値は次のとおりです:53、それはどのように可能ですか?なぜ52ではないのですか?

4

2 に答える 2

1

彼らは52.1を53に変換しました...小数部を切り捨てるよりも多くを表示する方が良いです。

また、週の開始日によっても異なります。

ヨーロッパおよびISO標準(月曜日から日曜日まで)-合計52週間、1月1日日曜日を表す短い(1日)週、および12月31日月曜日を表す短い(1日)週54週間の。

米国標準(日曜日から土曜日まで)-丸52週間、12月30日と31日を占める短い(2日)週、合計53週間。

土曜日から金曜日まで-51週間、1月1日から1月6日までの短い(6日)週、12月29日から12月31日までの短い(3日)週、合計53週間。

編集:

iOS NSCalenderは、デフォルトとしてISO8601に準拠して定義されているようです。予想される週番号の結果を取得するには、メソッド「setMinimumDaysInFirstWeek」を使用してカレンダーを設定する必要があります。

このコードを追加して確認してください

    [gregorian setMinimumDaysInFirstWeek:5]; //"5" means Thursday in this case.

http://en.wikipedia.org/wiki/ISO_week_date「年の最初の週は、その年の最初の木曜日を含む週です。」

編集2:

1年に可能な最小/最大週数を確認するため

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
int minWeeks, maxWeek;
minWeeks=maxWeek=0;
for (int weekCounter=1; weekCounter<=7; weekCounter++) {
    [gregorian setMinimumDaysInFirstWeek:weekCounter];
    [gregorian setFirstWeekday:2];
    NSDate* sourceDate = [NSDate date];
    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
    NSDate* today = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
    NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:today];
    NSUInteger todaysWeek = [todaysComponents week];

    if (todaysWeek>maxWeek) {
        maxWeek=todaysWeek;
    }
    if (todaysWeek<minWeeks || minWeeks==0) {
        minWeeks=todaysWeek;
    }
}
NSLog(@"min:%d, max:%d", minWeeks, maxWeek);
于 2012-12-24T09:03:52.980 に答える
0

次のコードを試してみてください。

NSDate *date = [NSDate date];
NSDateFormatter *weekFormatter = [[NSDateFormatter alloc] init];
[weekFormatter setDateFormat:@"w"];
NSString *weekDateString = [weekFormatter stringFromDate:date];
NSLog(@"week = %@",weekDateString);
[weekFormatter release];

上記のコードで年の週番号を取得できます。ただし、この数は現在のカレンダーとロケールに基づいています。

于 2012-12-24T09:05:09.510 に答える