2012-06-02 4 views
5

Mi piacerebbe ottenere l'ora e il minuto correnti come numeri interi. Quindi se adesso sono le 3:16, mi piacerebbe ottenere i due numeri interi: 3 e 16.In Objective-C, per ottenere l'ora e il minuto correnti come numeri interi, dobbiamo utilizzare NSDateComponents e NSCalendar?

Ma sembra che [NSDate date] darà il numero di secondi dal 1970, o può dare una stringa dell'attuale rappresentazione temporale, ma non esiste un modo semplice per ottenerli come numeri interi?

Vedo un post in Getting current time, ma ha coinvolto NSDateComponents e NSCalendar? Questo è troppo complicato ... tutto ciò che era bisogno c'è qualcosa come

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

è un modo più semplice rispetto all'utilizzo di 3 classi NSDate, NSDateComponents e NSCalendar per ottenere l'ora corrente come un intero, o in genere, in Objective -C, normalmente useremmo ancora il linguaggio C localtime e tm per ottenere l'ora come numero intero?

+0

ho controllato il riferimento, e penso che non c'è altro modo per aggirare questo. NSDate sembra essere solo il numero di secondi. – nhahtdh

+0

È possibile aggiungere un catalogo su NSDate ed estenderlo per calcolare il getHour utilizzando alcuni calcoli con un certo numero di secondi, siete disposti a farlo? –

risposta

9

NSDate solo detiene il tempo che è passato da una certa data di riferimento, per ottenere più significativi numeri su questo (ad es. Dopo aver preso cura di ora legale, gli anni bisestili e tutte le altre cose il tempo stupido), si ha utilizzare NSDateComponents con l'appropriato NSCalendar.

+0

+1 Buona spiegazione – Adam

+8

Per dirla in un altro modo, un 'NSDate' fa riferimento a un momento nel tempo. Quel momento può essere conosciuto come 3:16 am dove sei, ma lo stesso momento può essere conosciuto come 6:16 pm o anche 12:46 am altrove. Non c'è nulla nel momento * solo * che corrisponde a "3:16 am", devi specificare anche un fuso orario e un calendario. –

+0

@KenThomases meglio! +1 – user523234

17

Come si interpretano i secondi dal 1970 dipende dal calendario che si sta utilizzando. Semplicemente non c'è altra opzione. Fortunatamente non è così difficile da configurare. Vedi la 'Guida alla programmazione di dati e tempi' per molti esempi. Nel tuo caso:

// 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]; 

Quindi non è così complicato.

Si noti inoltre che si potrebbe creare una 'Class Categoria' per incapsulare questo come:

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

Leggi di nuovo la domanda. C'è un link. – Adam

1

mia classe può aiutare. https://github.com/TjeerdVurig/Vurig-Calendar/blob/master/Vurig%20Calendar/NSDate%2Bconvenience.m

Sono sicuro che si può capire la parte minuto :)

+0

a proposito, in seguito sembra che NSDateComponents volesse i flag di bit in modo che possa fornire i dati richiesti con un calcolo singolo, invece di calcolare tutto una volta per l'ora, e poi calcolare di nuovo tutto per il minuto –

+0

Sì Sono d'accordo che sarebbe meglio per questa situazione –

Problemi correlati