2012-06-02 5 views
5

Ich möchte die aktuelle Stunde und Minute als Ganzzahlen erhalten. Also, wenn jetzt 3:16 Uhr ist, würde ich gerne die zwei ganzen Zahlen: 3 und 16 bekommen.In Objective-C, um die aktuelle Stunde und Minute als Ganzzahlen zu erhalten, müssen wir NSDateComponents und NSCalendar verwenden?

Aber es sieht aus wie [NSDate date] wird die Anzahl der Sekunden seit 1970 geben, oder es kann eine Zeichenfolge des aktuellen geben Zeitdarstellung, aber es gibt keinen einfachen Weg, sie als Ganzzahlen zu bekommen?

Ich sehe einen Beitrag in Getting current time, aber es beteiligt NSDateComponents und NSCalendar? Das ist viel zu kompliziert ... alles, was war notwendig ist, so etwas wie

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

Gibt es einen einfacheren Weg, als die Verwendung von drei Klassen NSDate, NSDateComponents und NSCalendar die aktuelle Stunde als ganze Zahl zu erhalten, oder typischerweise in Objective -C, würden wir in der Regel noch C Sprache localtime und tm verwenden, um die Stunde als Ganzzahl zu erhalten?

+0

ich den Hinweis überprüft, und ich glaube, es um diese keinen anderen Weg. NSDate scheint nur die Anzahl der Sekunden zu sein. – nhahtdh

+0

Sie könnten einen Katalog auf NSDate hinzufügen und ihn erweitern, um die getHour zu berechnen, indem Sie einige Sekunden zu Datumsberechnungen verwenden, sind Sie dazu bereit? –

Antwort

9

NSDate hält nur die Zeit, die seit einem bestimmten Referenzdatum überschritten ist, mehr sinnvoll Zahlen aus diesem zu erhalten (z. B. nach der Pflege von DST nehmen, Schaltjahre und all die anderen Sachen dumm Zeit), haben Sie zu verwenden NSDateComponents mit der entsprechenden NSCalendar.

+0

+1 Gute Erklärung – Adam

+8

Um es anders auszudrücken, verweist ein 'NSDate' auf einen Moment. Dieser Moment kann als 3:16 bekannt sein, wo du bist, aber der gleiche Moment kann als 6:16 oder sogar 12:46 an einem anderen Ort bekannt sein. Es gibt nichts über den Moment * alone * was "3:16 am" entspricht, man muss auch eine Zeitzone und einen Kalender angeben. –

+0

@KenThomasen besser! +1 – user523234

17

Wie Sie die Sekunden seit 1970 interpretieren, hängt vom Kalender ab, den Sie verwenden. Es gibt einfach keine andere Möglichkeit. Glücklicherweise ist es nicht so schwer einzurichten. Viele Beispiele finden Sie im "Data and Time Programming Guide". In Ihrem Fall:

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

So ist es wirklich nicht so kompliziert.

Beachten Sie auch, dass Sie eine ‚Klasse Kategorie‘ schaffen könnte dies zu kapseln:

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

Lesen Sie die Frage erneut. Es gibt einen Link. – Adam

1

Meine Klasse helfen kann. https://github.com/TjeerdVurig/Vurig-Calendar/blob/master/Vurig%20Calendar/NSDate%2Bconvenience.m

Ich bin sicher, dass Sie die Minute Teil herausfinden können :)

+0

übrigens, später scheint es, dass NSDateComponents wollte die Bit-Flags, so dass es die erforderlichen Daten durch eine einmalige Berechnung geben kann, anstatt alles für die Stunde einmal zu berechnen, und dann wieder für die Minute –

+0

Ja berechnen Ich stimme zu, dass dies für diese Situation besser wäre –

Verwandte Themen