2012-10-01 6 views
19

Wie kann ich überprüfen, um zu sehen, ob ein Datum von Natur aus ist morgen?Objective C - erhält am nächsten Tag von heute (morgen)

Ich will nicht Stunden oder so etwas zu einem Datum wie heute hinzufügen, denn wenn heute bereits 22:59 ist, zu viel Zugabe nach dem Tag würde gehen, und das Hinzufügen von zu wenig, wenn die Zeit 12:00 ist morgen vermissen würde .

Wie kann ich zwei NSDate s und sorgen dafür, dass man das Äquivalent von morgen für den anderen ist?

+1

möglich Duplikat [Wie kann ich nächsten Termin mit NSDate bekommen?] (Http: // stackoverflow.com/questions/1081689/how-can-i-get-next-date-using-nsdate) – raina77ow

Antwort

49

Mit NSDateComponents können Sie Tag/Monat/Jahr-Komponenten aus dem Datum, das heute darstellt, extrahieren, die Stunden/Minuten/Sekunden-Komponenten ignorieren, einen Tag hinzufügen und ein Datum für morgen neu erstellen.

Also stellen Sie sich vor, Sie möchten genau einen Tag zum aktuellen Datum hinzufügen (einschließlich Stunden/Minuten/Sekunden Informationen die gleiche wie das "jetzt" Datum), Sie könnten ein timeInterval von 24 * 60 * 60 Sekunden hinzufügen " „jetzt mit dateWithTimeIntervalSinceNow, aber es ist besser (und DST-Beweis usw.) es auf diese Weise zu tun NSDateComponents mit:

NSDateComponents* deltaComps = [[[NSDateComponents alloc] init] autorelease]; 
[deltaComps setDay:1]; 
NSDate* tomorrow = [[NSCalendar currentCalendar] dateByAddingComponents:deltaComps toDate:[NSDate date] options:0]; 

aber wenn Sie das Datum entsprechend morgen um Mitternacht generieren möchten, können Sie stattdessen abrufen nur die Monat/Tag/Jahr Komponenten der Zeitpunkt jetzt darstellt, ohne Stunden/min/sec Teil und 1 Tag hinzufügen, dann wieder aufzubauen ein Datum:

// Decompose the date corresponding to "now" into Year+Month+Day components 
NSUInteger units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
NSDateComponents *comps = [[NSCalendar currentCalendar] components:units fromDate:[NSDate date]]; 
// Add one day 
comps.day = comps.day + 1; // no worries: even if it is the end of the month it will wrap to the next month, see doc 
// Recompose a new date, without any time information (so this will be at midnight) 
NSDate *tomorrowMidnight = [[NSCalendar currentCalendar] dateFromComponents:comps]; 

P. S .: Sie wirklich nützliche Ratschläge und Sachen über Datum Konzepte im Date and Time Programming Guide lesen können, insbesondere here about date components.

+0

sehr, sehr gute Antwort! –

+0

Wie arbeiten Sie sich um die Tatsache, dass '' NSCalendar' der dateFromComponents' gibt 'nullable' Ergebnis? Ich weiß, dass morgen immer existiert und diese Tatsache beim Codieren nutzen will. Wenn ich diesen Ansatz jedoch in Swift verwende, kann 'tomorrowMidnight'' '_' '' '' 'nil' sein, zumindest denkt das der Compiler. – i4niac

6

In IOS 8 gibt es eine bequeme Methode auf NSCalendarisDateInTomorrow genannt.

Objective-C

NSDate *date; 
BOOL isTomorrow = [[NSCalendar currentCalendar] isDateInTomorrow:date]; 

Swift 3

let date: Date 
let isTomorrow = Calendar.current.isDateInTomorrow(date) 

Swift 2

let date: NSDate 
let isTomorrow = NSCalendar.currentCalendar().isDateInTomorrow(date) 
Verwandte Themen