0

現在のメソッドを使用して、現在の週の最初と最後の日を取得しています。

NSDate *weekDate = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:weekDate];

[currentComps setWeekday:1]; // 1: sunday
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:7]; // 7: saturday
NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps];

これは完璧に機能していましたが、現在は ios 4.3 で機能していません。

何が問題になる可能性がありますか?

4

3 に答える 3

1

OS X 10.6 パーティションで Xcode 4.1 を起動し、iOS 4.3 SDK に対してコードをコンパイルしようとしました。は未定義であることが判明したNSWeekOfYearCalendarUnitため、後の iOS バージョンで導入されたに違いありません。これは、iOS 4.3 で動作しない理由を説明している可能性があります。

次の代替コードが機能し、正しい結果が得られます。

NSDate *now = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *firstDayOfTheWeek;
NSTimeInterval length;
[myCalendar rangeOfUnit:NSWeekCalendarUnit
                                startDate:&firstDayOfTheWeek
                                 interval:&length
                                  forDate:now];
NSDate *lastDayOfTheWeek = [firstDayOfTheWeek dateByAddingTimeInterval:length];

更新:上記のコードは、週の最初の日 (開始日) と次の週 (開始日) を示します。(length - 1)thenの代わりに追加するlengthと、その週の最後の日の終わりが得られます (@rmaddy に感謝します!)。または、初日に 6 日を追加することもできます。

NSDate *now = [NSDate date];
NSDate *firstDayOfTheWeek;
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[myCalendar rangeOfUnit:NSWeekCalendarUnit
                                startDate:&firstDayOfTheWeek
                                 interval:NULL
                                  forDate:now];
NSDateComponents *sixDays = [[NSDateComponents alloc] init];
[sixDays setDay:6];
NSDate *lastDayOfTheWeek = [myCalendar dateByAddingComponents:sixDays toDate:firstDayOfTheWeek options:0];

注意:このコードは、ロケールに従って「週の始まり」も正しく処理します。

于 2013-05-24T17:57:40.803 に答える
0

3 番目のコンポーネントである は、 iOSNSWeekOfYearCalendarUnit 5 以降でのみ利用可能です。あなたがしていることについては、そのコンポーネントは必要ないので、削除するだけでよいと思います。

この投稿の他のユーザーからのローカリゼーションに関するコメントについては、異なるロケールで物事が変化することは正しいですが、期待する方法ではありません。実際、日曜日は常に 1 日目 (および土曜日は 7 日目) ですが、月曜日が週の最初の日である文化圏では、コードは次の土曜日と次の日曜日を返し、週の終わりに見えるように見えます。en-US ロケールを使用するようにカレンダーを明示的に設定するか、firstDayOfWeek プロパティを使用して他のロケールを考慮することで、これを修正できます。これをテストするには、シミュレーターの地域形式を [ドイツ語] > [ドイツ] に切り替えて、[設定] > [一般] > [国際] > [地域形式] に移動します。

于 2013-05-24T18:03:57.510 に答える
0

どの意味で問題を抱えているかは不明ですが、単に週の最初の曜日が一致していない可能性があります。

[古い例は編集済み。以下のマイクは、それが無効であることを正しく指摘しました]

NSDateComponents のドキュメントによると、「たとえば、グレゴリオ暦では、n は 7 で、日曜日は 1 で表されます。」; お使いのデバイスが iOS でサポートされている他の 9 つのカレンダー (仏暦、中国暦、ヘブライ暦など) のいずれかを使用している場合、Apple は日曜日が 1 日目であることを保証しません。

于 2013-05-24T17:19:19.253 に答える