2011-12-09 9 views
7

Mam próbnik dat.Uzyskaj tablicę przyszłych NSDates

Po wybraniu czasu chciałbym otrzymać daty najbliższych 64 poniedziałków.

Jak pójdę o pisaniu metodę na randkę i zwraca NSArray z NSDates przez następne 64 poniedziałki od tej daty

na przykład Wybrałem godzinę 18:45 z selektora dat, a następnie chcę pobrać następne 64 dni z czasem ustawionym na ten czas.

+8

Dla przypomnienia, nie zgadzam się z bliskich głosów. –

+0

tak ... to przyzwoite wyzwanie; Ayaz, kiedy mówisz, że chcesz "przynieść" następne 64 poniedziałki, w jakiej formie chcesz to zrobić? NSDates lub EKEvents lub? –

+0

Chcę NSDates ... –

Odpowiedz

3

Przykład (ARC)

NSDate *pickerDate = [NSDate date]; 
NSLog(@"pickerDate: %@", pickerDate); 

NSDateComponents *dateComponents; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate]; 
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday]; 
dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setDay:firstMondayOrdinal]; 
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0]; 

dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setWeek:1]; 

for (int i=0; i<64; i++) { 
    [dateComponents setWeek:i]; 
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0]; 
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate); 
} 

NSLog wyjściowych:
pickerDate: 09.12.2011 20:38 : 25 +0000
tydzień #: 0, mondayDate: 2011-12-12 20:38:25 +0000
tydzień #: 1, mondayDate: 2011-12-19 20:38:25 +0000
tygodni # : 2, poniedziałekData: 2011-12-26 20:38:25 +0000
tydzień #: 3, mondayDate: 2012-01-02 20:38:25 +0000
-the pozostałe 60 tutaj-

+0

Dzięki za wyraźną odpowiedź. to następne 4 poniedziałki. Czy powinienem przepuścić go 63 razy zamiast 4? –

+0

Po prostu pokazuję pierwsze cztery, które zredagowałem, aby było to bardziej jasne. – zaph

+1

Po prostu ciekawy, skąd wziął się "9" do obliczenia "firstMondayOrdinal"? –

1

Możesz użyć NSCalendar, aby określić dzień tygodnia (o wybranej godzinie); podbij to, aby dostać się do następnego poniedziałku, a następnie uderz go o 7 dni 63 razy, aby uzyskać poniedziałki, które wydaje się, że chcesz.

2

Zacznij od wybieraka NSDate i dodaj do niego 24 * 60 * 60 sekund do poniedziałku. Dodaj wynikową datę do wyniku. Kontynuuj dodawanie 7 * 24 * 60 * 60 sekund do ostatniej dodanej daty i pchanie wyniku na listę zwrotną, aż uzyskasz wszystkie 64 poniedziałki. Oto w jaki sposób stwierdzić, czy NSDate przypada na poniedziałek:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest]; 
NSInteger weekday = [weekdayComponents weekday]; 
if (weekday == 2) ... // 2 represents Monday 

EDIT: DaveDeLong wskazał niedobór powyższego algorytmu: będzie przesunąć po raz dwa razy w dniach zmiana na czas letni. Zamiast zliczania sekund ręcznego, ten kod dodać dzień NSDate:

NSDate *currentDate = [NSDate date]; 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:1]; // Add 1 when searching for the next Monday; add 7 when iterating 63 times 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate options:0]; 
[comps release]; 
+2

NIE NIE NIE NIE NIE to nie uwzględnia czasu letniego! A pytający wyraźnie powiedział, że chce pozostać w tym samym czasie. –

+0

@DaveDeLong Dobry połów! Naprawianie ... – dasblinkenlight

+1

@DaveDeLong Dyskusja na temat tego, czy Apple zna czas letni, oceniając na podstawie wyników z przeszłości. :-) – zaph

Powiązane problemy