2012-06-02 8 views
5

Chciałbym uzyskać bieżącą godzinę i minutę jako liczby całkowite. Więc jeśli teraz jest 3:16, chciałbym otrzymać dwie liczby całkowite: 3 i 16.W Objective-C, aby uzyskać bieżącą godzinę i minutę jako liczby całkowite, musimy użyć NSDateComponents i NSCalendar?

Ale wygląda na to, że [NSDate date] poda liczbę sekund od 1970 roku, lub może podać ciąg bieżących reprezentacja czasu, ale nie ma łatwego sposobu na uzyskanie ich jako liczby całkowite?

Widzę post w numerze Getting current time, ale dotyczy on NSDateComponents i NSCalendar? To zbyt skomplikowane ... wszystko, co potrzeba jest coś takiego jak

NSDate *date = [NSDate date]; 
int hour = [date getHour];  // which is not possible 

Czy istnieje prostszy sposób niż przy użyciu 3 klasy NSDate, NSDateComponents i NSCalendar uzyskać aktualną godzinę jako liczbę całkowitą, lub typowo w Celu -C, czy zwykle używamy języka C localtime i tm, aby uzyskać godzinę jako liczbę całkowitą?

+0

Sprawdziłem odniesienia i myślę, że nie ma innego sposobu obejścia tego. NSDate wydaje się być tylko liczbą sekund. – nhahtdh

+0

Można dodać katalog na NSDate i rozszerzyć go, aby obliczyć getHour za pomocą kilku sekund do obliczeń na bieżąco, czy jesteś gotów to zrobić? –

Odpowiedz

9

NSDate prostu trzyma czas, który upłynął od określonej daty odniesienia, aby uzyskać więcej sensownych numery z tego (np. Po dbanie o DST, lata przestępne i wszystkie inne głupie czasową rzeczy), trzeba używać NSDateComponents z odpowiednim NSCalendar.

+0

+1 Dobre wyjaśnienie – Adam

+8

Innymi słowy, 'NSDate' odnosi się do momentu w czasie. Ta chwila może być znana jako 3:16, gdzie jesteś, ale ta sama chwila może być znana jako 6:16 pm lub nawet 12:46 w innym miejscu. Nie ma nic o chwili * samego *, która odpowiada "3:16", musisz także określić strefę czasową i kalendarz. –

+0

@KenThomases lepiej! +1 – user523234

17

Sposób interpretacji sekund od 1970 zależy od kalendarza, którego używasz. Po prostu nie ma innej opcji. Na szczęście nie jest to takie trudne. Zobacz "Przewodnik programowania danych i czasu" na wiele przykładów. W twoim przypadku:

// Assume you have a 'date' 
NSCalendar *gregorianCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *dateComps = [gregorianCal components: (NSHourCalendarUnit | NSMinuteCalendarUnit) 
               fromDate: date]; 
// Then use it 
[dateComps minute]; 
[dateComps hour]; 

To naprawdę nie jest takie skomplikowane.

Należy również pamiętać, że można stworzyć „klasa kategorii” do hermetyzacji to jako:

@interface NSDate (MyGregorianDateComponents) 
    - (NSInteger) getGregorianHour; 
    - (NSInteger) getGregorianMinute; 
    @end 
+0

Przeczytaj ponownie to pytanie. Jest link. – Adam

1

Moja klasa może pomóc. https://github.com/TjeerdVurig/Vurig-Calendar/blob/master/Vurig%20Calendar/NSDate%2Bconvenience.m

Jestem pewien, że można dowiedzieć się udział minut :)

+0

przy okazji, później wydaje się, że NSDateComponents chciał flag bitowych, aby mógł podać wymagane dane przez jednorazowe obliczenia, zamiast obliczyć wszystko raz na godzinę, a następnie obliczyć wszystko od nowa dla minuty –

+0

Tak Zgadzam się, że byłoby lepiej w tej sytuacji –

Powiązane problemy