-(NSDate *)beginningOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
}
-(NSDate *)endOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
}
Wenn ich anrufe: [self endOfDay: [NSDate date]]; Ich bekomme den ersten des Monats ... Warum ist das so? Ich benutze diese beiden Methoden, weil ich ein Intervall benötige, das von der ersten Sekunde des ersten Datums (beginOfDay: date1) bis zur letzten Sekunde des zweiten Datums (endOfDay: Date2) reicht ...
ios
nsdate
nsdatecomponents
user1028028
quelle
quelle
Antworten:
Sie fehlen
NSDayCalendarUnit
inquelle
Tagesbeginn / Tagesende - Swift 4
quelle
NSYearCalendarUnit
,NSMonthCalendarUnit
UndNSDayCalendarUnit
haben als von iOS 8. Verwendung als veraltetNSCalendarUnitYear
,NSCalendarUnitMonth
undNSCalendarUnitDay
statt!Swift 5 Einfache und präzisere Antwort.
Startzeit: 00:00:00
Endzeit: 23: 59: 59,5
Extra
quelle
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?In iOS 8+ ist dies sehr praktisch. du kannst tun:
Um das Ende des Tages zu erhalten, verwenden Sie einfach die NSCalendar-Methoden für 23 Stunden, 59 Minuten und 59 Sekunden, je nachdem, wie Sie das Ende des Tages definieren.
Datum Math
Apple iOS NSCalendar-Dokumentation . (Siehe Abschnitt: Kalenderberechnungen )
Von NSHipster diskutierte NSCalendar-Methoden .
quelle
Meine Swift-Erweiterungen für NSDate:
Swift 1.2
Swift 2.0
quelle
Swift 5.1 - XCode 11 mit
Date
Klasse anstelle vonNSDate
undCalender
anstelle vonNSCalender
Verwendung:
quelle
Date
wenn ich ihn auf dem Spielplatz versucheimport UIKit
?Sie müssen die Komponenten nicht auf Null setzen, sondern ignorieren sie einfach:
quelle
[calendar startOfDayForDate:date]
, aber es gibt-endOfDayForDate:
leider keine ...Für mich hat keine der Antworten hier und sonst wo auf Stackoverflow funktioniert. Um heute loszulegen, habe ich das gemacht.
Beachten Sie dies
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
und[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Wenn ein Kalender erstellt wird, wird er mit der aktuellen Zeitzone initialisiert. Wenn das Datum aus seinen Komponenten extrahiert wird, wird das Datum aus der aktuellen Zeitzone als UTC-Zeitzone betrachtet, da NSDate keine Zeitzone hat. Daher müssen wir die Zeitzone vor dem Extrahieren von Komponenten und später beim Extrahieren des Datums aus diesen Komponenten festlegen.
quelle
Swift 3
quelle
Swift3 Verwenden von * XCode8
Apple entfernt das
NS
aus dem Klassennamen,NSDate
damit es ausgetauscht werden kannDate
. Möglicherweise erhalten Sie eine Compiler-Warnung, wenn Sie versuchen, sie zu besetzen, dass sie immer fehlschlagen. Sie funktionieren jedoch einwandfrei, wenn Sie sie auf dem Spielplatz ausführen.Ich habe mein
NSDate
im Kerndaten generiertes Modell durch ersetztDate
und sie funktionieren immer noch.quelle
In Swift 3 und höher
Verwendung:
quelle
Ein weiterer Weg, um ein Ergebnis zu erzielen:
quelle
Sie fehlen
NSDayCalendarUnit
in den Komponenten.quelle
Ziel c
quelle
Für schnelle 4
quelle
Ich denke, der prägnanteste Weg, dies in Swift zu tun, ist folgender:
quelle
Da
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
es in der Foundation eine eingebaute Funktion gibt, die Sie sofort nutzen können. Keine Notwendigkeit, eigene Funktionen zu implementieren.public func startOfDay(for date: Date) -> Date
Sie können es also folgendermaßen verwenden:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Es ist zu beachten, dass dies die Zeitzone des Geräts berücksichtigt. Sie können festlegen ,
.timeZone
aufcalendar
, wenn Sie zB UTC Zone haben wollen.Link zu den Apple-Referenzseiten: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
quelle
Nur eine andere Art der Verwendung
dateInterval(of:start:interval:for:)
vonCalendar
Bei der Rückkehr
startDate
enthält der Beginn des Tages undinterval
die Anzahl der Sekunden am Tag.quelle
Folgendes verwende ich für Swift 4.2:
Funktioniert wie ein Zauber für mich. Sie können dies zu einer Erweiterung für Start- und Enddatum
Date
hinzufügen. Beachten Sie jedoch, dass das Hinzufügen einer Erweiterung die Kompilierungszeit verlängert (außer in derselben Datei wie die Klasse). Wenn Sie sie also nur an einer Stelle oder in einer Klasse benötigen. .. keine Erweiterung verwenden.quelle
quelle
Nur als Referenz, einfache Möglichkeit, Start und Ende des Tages in Swift 4 festzulegen ,
quelle
Kalendereinheiten sollten als Intervalle betrachtet werden. Ab iOS 10
Calendar
gibt es dafür einige nette MethodenSie können dieselbe Methode verwenden, um den Anfang / das Ende einer Kalenderkomponente (Woche / Monat / Jahr usw.) abzurufen.
quelle
day?.end
wird morgen um 00:00 Uhr ausgewertet, heute Abend nicht um 23:59 Uhr.