12 Stimmen

Gibt es einen besseren Weg, um morgen Mitternacht zu finden?

Gibt es eine bessere Möglichkeit, dies zu tun?

-(NSDate *)getMidnightTommorow {
    NSCalendarDate *now = [NSCalendarDate date];
    NSCalendarDate *tomorrow = [now dateByAddingYears:0 months:0 days:1 hours:0 minutes:0 seconds:0];
    return [NSCalendarDate dateWithYear:[tomorrow yearOfCommonEra]
                                  month:[tomorrow monthOfYear]
                                    day:[tomorrow dayOfMonth]
                                   hour:0
                                 minute:0
                                 second:0
                               timeZone:[tomorrow timeZone]];
}

Beachten Sie, dass ich immer die nächste Mitternacht will, auch wenn es zufällig Mitternacht ist, wenn ich diesen Anruf tätige, aber wenn es zufällig 23:59:59 ist, will ich natürlich die Mitternacht, die in einer Sekunde kommt.

Die Funktionen der natürlichen Sprache scheinen fehlerhaft zu sein, und ich bin mir nicht sicher, was Cocoa tun würde, wenn ich 32 im Feld "Tag" übergebe. (Wenn das funktionieren würde, könnte ich den [now dateByAddingYears:...] Aufruf weglassen)

25voto

mmalc Punkte 8201

Von der Dokumentation :

Verwendung von NSCalendarDate stark abgeraten. Sie ist noch nicht veraltet, wird aber möglicherweise in der nächsten größeren OS Version nach Mac OS X v10.5. Für kalendarische Berechnungen, sollten Sie geeignete Kombinationen von NSCalendar, NSDate und NSDateComponents verwenden, wie beschrieben in Kalendern in Daten und Zeiten Programmierthemen für Cocoa .

Befolgen Sie diesen Rat:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;
NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
components = [gregorian components:unitFlags fromDate:tomorrow];
components.hour = 0;
components.minute = 0;

NSDate *tomorrowMidnight = [gregorian dateFromComponents:components];

[gregorian release];
[components release];

(Ich bin mir nicht sicher, ob dies die effizienteste Implementierung ist, aber es sollte als Hinweis in die richtige Richtung dienen).

Hinweis: Theoretisch können Sie den Umfang des Codes hier reduzieren, indem Sie ein Datumskomponenten-Objekt mit Werten zulassen, die über den Bereich der normalen Werte für die Komponente hinausgehen (z. B. indem Sie einfach 1 zur Tageskomponente hinzufügen, was zu einem Wert von 32 führen könnte). Doch obwohl dateFromComponents: Mai Werte außerhalb des zulässigen Bereichs tolerieren, ist dies nicht garantiert. Wir raten Ihnen dringend davon ab, sich darauf zu verlassen.

0 Stimmen

Und im Anschluss an diesen Zeiger sieht es so aus, als könnte ich das meiste davon als dateFromComponents ausschneiden hace scheinen Tage über das Monatsende hinaus zu tolerieren.

0 Stimmen

DateFromComponents Mai Werte außerhalb der Grenzen tolerieren, aber es ist nicht garantiert. Es wird dringend empfohlen, sich nicht darauf zu verlassen.

0 Stimmen

Ich bin an der Ostküste, und wenn ich die obige Umrechnung durchführe, erhalte ich heute den ganzen Tag über 1 Uhr morgens (meine Zeitverschiebung beträgt -5 Stunden, aber NSCalendar scheint davon überzeugt zu sein, dass es -4 Stunden sind. (Auch wenn ich die Zeitzone explizit einstelle)

7voto

loudej Punkte 1871

Nein - es wird derselbe Weg sein, auf dem Sie heute Mitternacht finden.

1 Stimmen

Ich fürchte, die Leute hier haben einen sehr defekten Ironie-/Humordetektor. Wenn du deine lustigen Kommentare nicht als solche kennzeichnest, wirst du heruntergestuft. BTDT.

0 Stimmen

Ich werde Ihre Antwort nicht herabwürdigen, aber selbst wenn sie lustig wäre, was ist der Witz daran? Eine schnoddrige kurze Antwort, die die Details der Frage ignoriert? Sie könnten Ihren "Witz" für jede einzelne technische Frage auf SO verwenden. DAS ist der Grund, warum es nicht lustig ist.

0 Stimmen

Das heißt nicht, dass die Formel dieselbe ist wie heute plus eins. Es ist ein absichtliches Missverstehen der Satzstruktur der Frage, als ob ich glaubte, Dre würde fragen, ob es eine bessere Formel gäbe, die derzeit nicht verfügbar wäre, wenn er einen Tag warten würde. "Gibt es einen besseren Weg, um morgen Mitternacht zu finden?" Sehen Sie? Darauf könnte man zu Recht antworten: "Wenn man es erklären muss, ist es nicht lustig."

4voto

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:(24 * 60 * 60)];

NSDateComponents *components = [gregorian components:(NSYearCalendarUnit |
                                                      NSMonthCalendarUnit |
                                                      NSDayCalendarUnit)
                                            fromDate:tomorrow];

NSDate *midnight = [gregorian dateFromComponents:components];

6 Stimmen

Jedes Mal, wenn ein Programmierer einen Tag als 60 * 60 * 24 definiert, stirbt eine Schaltsekunde. Tun Sie das nicht.

1voto

user58338 Punkte 19
[NSDate dateWithNaturalLanguageString:@"midnight tomorrow"];

0 Stimmen

Interessanter Ansatz (und ich habe ihn deshalb hochgestuft), aber beachten Sie die Warnung in der Dokumentation: "Es kann zu unerwarteten Ergebnissen führen, und von seiner Verwendung wird dringend abgeraten."

0 Stimmen

Danke, ich war auf der Suche nach einer besseren Lösung zu, da das iPhone sdk nicht mag, wenn ich es verwenden, aber es funktioniert immer noch für jetzt :)

0voto

selwyn Punkte 1154

Konvertieren Sie Ihr aktuelles Datum und Ihre Uhrzeit in ein Unix-Datum (Sekunden seit 1970) oder in ein DOS-Datum (seit 1980), fügen Sie dann 24 Stunden hinzu und konvertieren Sie es zurück. Setzen Sie dann die Stunden, Minuten und Sekunden auf Null zurück, um auf Mitternacht zu kommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X