2012-10-10 6 views
5

Edytowany 07/08/13: Apple ma znakomity zestaw filmów WWDC, które naprawdę pomogły mi zrozumieć różne klasy dat i godzin w Objective-C oraz jak poprawnie wykonać obliczenia czasu/manipulacje z nimi.Programowe pobieranie daty "w następną niedzielę o 17:00"

"Rozwiązania wspólna data i czas wyzwania" (HD video, SD video, slides (PDF)) (WWDC 2013)
"Wykonywanie Kalendarz Obliczenia" (SD video, slides (PDF)) (WWDC 2011)

Uwaga: linki wymagają bezpłatnego członkostwa programisty Apple.

Piszę aplikację na podcast przyjaciela. Emituje swój program na żywo w każdą niedzielę o 17:00 i chciałbym napisać kod w mojej aplikacji, aby opcjonalnie zaplanować lokalne powiadomienie na ten czas, aby przypomnieć użytkownikowi, kiedy będzie następny koncert. Jak chciałbym uzyskać obiekt NSDate, który reprezentuje "następną niedzielę, o 17:00 czasu pacyficznego". (Oczywiście miałoby to być przekształcony cokolwiek stref czasowych użytkownik korzysta)

+2

Niesamowite łączenie i aktualizacja. Dobra na ciebie! – uchuugaka

Odpowiedz

14

Pierwszy uzyskać aktualny dzień tygodnia:

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

NSDateComponents *dateComponents = [calendar components:NSCalendarUnitWeekday | NSCalendarUnitHour fromDate:now]; 
NSInteger weekday = [dateComponents weekday]; 

Apple docs określić dzień tygodnia jako:

Dzień tygodnia jednostki to liczby od 1 do n, gdzie n to liczba dni w tygodniu. Na przykład w kalendarzu gregoriańskim, n wynosi 7 i niedziela jest reprezentowana przez 1.

Następny dowiedzieć się, ile dni, aby dodać do dostać się do następnej niedzieli na 5:

NSDate *nextSunday = nil; 
if (weekday == 1 && [dateComponents hour] < 5) { 
    // The next Sunday is today 
    nextSunday = now; 
} else { 
    NSInteger daysTillNextSunday = 8 - weekday; 
    int secondsInDay = 86400; // 24 * 60 * 60 
    nextSunday = [now dateByAddingTimeInterval:secondsInDay * daysTillNextSunday]; 
} 

Do dostać to o 5:00 można po prostu zmienić godzinę i minutę na nextSunday do 5:00. Spójrz na get current date from [NSDate date] but set the time to 10:00 am

+0

W tym kodzie występuje subtelny błąd. "Kalendarz" domyślnie używa bieżących ustawień narodowych. Jeśli oznacza to na przykład strefę czasową Nowej Zelandii, to znacznie różni się ona od czasu pacyficznego. Rezultat może być taki, że kod oblicza się w następną niedzielę w 6 lub 7 dni, kiedy następna * Kalifornijska * Niedziela-w-5 to tylko kilka godzin naprzód. –

+2

Również kod do obliczania 'nextSunday' ulega przerwaniu, gdy jest zmiana dzienna w tym okresie. –

Powiązane problemy