2011-02-03 17 views
2

私は特定の日付の前に月曜日が必要な状況があります(特定の日付はlocaltournament.entryDeadlineです)。私は以下を試しましたが、それは私に同じ日付を返します。私はいくつかの同様の質問が見つかりましたが、iOS上でこれを行うことはできません。それは簡単だと思いますが、私は実際にココアのデート・フレームワークが好きですが、私は今これで困っています。iOSの今日の前日の月曜日を見つける

私は間違っていますか?結果(必ず月曜日でなければなりません)はlocalTournament.entryOpenにあります。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:localTournament.entryDeadline]; //1=sunday, 2=monday, etc 

if(comps.weekday > 2) { 
    //later in same week 
    [comps setWeekday:2]; 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateFromComponents:comps]; 
} else if(comps.weekday == 1) { 
    //sunday, go back a week 
    [comps setWeek:-1]; 
    [comps setWeekday:2]; 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateByAddingComponents:comps toDate:localTournament.entryDeadline options:0]; 

} else { 
    //already monday, use previous week 
    [comps setWeek:-1]; 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateByAddingComponents:comps toDate:localTournament.entryDeadline options:0]; 
} 

[calendar release]; 

答えて

1

解決策(下)は、私が行って引く必要がある日数を決定することでした。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:localTournament.entryDeadline]; //1=sunday, 2=monday, etc 

if(comps.weekday > 2) { 
    //later in same week 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateFromComponents:comps]; 

    NSDateComponents *sparseComps = [[[NSDateComponents alloc] init] autorelease];  
    [sparseComps setDay:0-(comps.weekday-2)]; 

    localTournament.entryOpen = [calendar dateByAddingComponents:sparseComps toDate:localTournament.entryOpen options:0]; 
} else if(comps.weekday == 1) { 
    //sunday, go back a week and add a day 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateFromComponents:comps]; 

    NSDateComponents *sparseComps = [[[NSDateComponents alloc] init] autorelease]; 
    [sparseComps setWeek:-1]; 
    [sparseComps setWeekday:1]; 
    localTournament.entryOpen = [calendar dateByAddingComponents:sparseComps toDate:localTournament.entryOpen options:0]; 
} else { 
    //already monday, use previous week 
    [comps setHour:12]; 
    localTournament.entryOpen = [calendar dateFromComponents:comps]; 

    NSDateComponents *sparseComps = [[[NSDateComponents alloc] init] autorelease]; 
    [sparseComps setWeek:-1]; 
    localTournament.entryOpen = [calendar dateByAddingComponents:sparseComps toDate:localTournament.entryOpen options:0]; 
} 

[calendar release]; 
+0

一部のロケールでは、日曜日は週の始まりではないため、月曜日は2日目ではありません。これには考慮されません。 – kris

+0

Krisのコメントについては、「週の初めの取得」の例については、iOSの日付と時刻のプログラミングガイドの「日の計算」のセクションを参照してください。 http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1 – Alan

1

あなたは両方NSWeekdayCalendarUnitNSDayCalendarUnitコンポーネントを指定した場合、NSCalendar方法は(ある)平日情報オーバー(更新されていない)日情報を好むでしょう。 NSDayCalendarUnitを完全に削除し、NSWeekCalendarUnitと置き換えるか、平日の代わりに日を更新します。

詳細については、dateFromComponents:のドキュメントを参照してください。

0

あなたは週平日で動作するように望んでいるならば、あなたはweekdayweekOfYear要素の代わりに、daymonthコンポーネントを含む新しいNSDateComponentオブジェクトを作成する必要があり、ジャスティンの答えを推定します。これには新しい一時オブジェクトが必要な場合があります。ここで

は次金曜日見つけた私のプロジェクトからいくつかのコードですが、それは同様の考えです:( calGergoriandcNowは私のクラスのプロパティですが、自明でなければなりません)

_dcNextWeekReminderTime = [[NSDateComponents alloc] init]; 

    _dcNextWeekReminderTime.weekday = 6; 
    _dcNextWeekReminderTime.weekOfYear = self.dcNow.weekOfYear; 
    _dcNextWeekReminderTime.year = self.dcNow.year; 
    _dcNextWeekReminderTime.calendar = self.calGregorian; 

    //if the date we've just created is earlier than today... 
    if ([[self.calGregorian dateFromComponents:_dcNextWeekReminderTime] timeIntervalSinceDate:[self.calGregorian dateFromComponents:self.dcNow]] < 0) { 

     //...make it next week 
     _dcNextWeekReminderTime.weekOfYear +=1; 

    } 

(恩赦私のハンガリアン記法)

あなたの問題を解決するために、あなたは基本的に)月曜日(2にif文で<>を変更し、-=1+=1を変更し、番号6日(金)と思います。

また、古いiOSバージョンで作業している場合を除き、weekは非推奨となり、weekOfYearとなりました。

関連する問題