Wie setze ich die Zeit eines vorhandenen NSDATE?
-
27-10-2019 - |
Frage
Wie setze ich eine vorhandene NSDate
Zeit?
Das ist, ich habe ein Datum (z. B. aktuelles Datum/Uhrzeit), möchte dies dann aber auf eine bestimmte Zeit festlegen (z. B. 11.23 Uhr). Was ist der schnellste Weg, dies in objektiv C zu tun?
Ich schaue auf NSCalendar
und sehen Methoden wie z. dateByAddingComponents:toDate:options:
, und dateFromComponents:
, aber diese scheinen nicht ganz die Marke für das zu treffen, was ich hier brauche. Zum Beispiel:
dateFromComponents:
- Ich müsste alle Komponenten ausarbeiten, damit dies funktioniert, was wie Overkill erscheintdateByAddingComponents:toDate:options:
- Ich möchte nicht in meinem Fall hinzufügen, sondern die Zeit "festlegen".
Lösung
NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date];
[components setHour: 7];
[components setMinute: 59];
[components setSecond: 17];
NSDate *newDate = [gregorian dateFromComponents: components];
ich benutze NSUIntegerMax
Anstelle von spezifischen oder kombinierten Bitmasken, da es einfacher ist, aber wenn Sie angeben möchten, welche Datenkomponenten empfangen werden sollen, seien Sie mein Gast.
Andere Tipps
iOS 7 Anmerkung: Ich setze dies in ein paar dieser Fragen, weil die Verwendung von NSUIntegermax nicht mehr auf iOS7 zu funktionieren scheint, und ich habe dazu geführt, dass ich meinen Schwanz etwa 3 Stunden lang jagte. Ich habe das gerade entdeckt, wenn ich benutze NSUIntegerMax
, NSDateComponents
ignoriert das festgelegte Jahr. Dies ändert sich zum Beispiel nicht das Jahr:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Während dies der Fall ist:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger timeComps = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit);
NSDateComponents *comps = [gregorian components:timeComps fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Es kann ein iOS7 -Fehler sein oder es kann sein, dass die Verwendung von NsuIntegermax -Arbeiten ein Zufall war, der nicht mehr funktioniert. Ich werde einen Fehlerbericht einreichen und eine endgültige Antwort erhalten.
Unabhängig davon, wenn Sie unerwartete Konsequenzen vermeiden möchten, geben Sie alle Komponenten an, die Sie ansonsten möglicherweise verfolgen!
SWIFT 2.0 -Version, wie Sie ein bestimmtes Datum auf 8 Uhr morgens festgelegt haben
extension NSDate {
func setTo8AM() -> NSDate {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
components.hour = 8
return calendar.dateFromComponents(components)!
}
}
Wenden Sie dies an, um die Zeit von einem anderen Datum auf ein vorhandenes Datum festzulegen
NSDate *today = [NSDate date]; // from which i need only "Year" "Month" "Date"
NSCalendar *calendar = [NSCalendar currentCalendar]
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ) fromDate:today];
NSDate *timeDate = datePicker.date; // from which i need only "Hours" "Minutes" and "Seconds"
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:timeDate];
[dateComponents setHour:[timeComponents hour]];
[dateComponents setMinute:[timeComponents minute]];
[dateComponents setSecond:[timeComponents second]];
NSDate *newDate = [calendar dateFromComponents:dateComponents]; // New Date with My "Year" "Month" "Date" "Hours" "Minutes" and "Seconds"
NSLog(@"New Date: %@",newDate);
Hier ist eine generische Swift (V2.1.1) Erweiterung, die auf Andrew Schreibers hilfreiche Antwort aufbaut.
extension NSDate {
func dateWithTime(hour: Int, minute: Int, second: Int) -> NSDate? {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
components.hour = hour
components.minute = minute
components.second = second
let newDate = calendar.dateFromComponents(components)
return newDate
}
}
Ein schnelles Beispiel. Für meine Zwecke wollte ich morgen gegen 12 Uhr das Datum für ca. 12.00 Uhr bekommen.
var tomorrow:NSDate = NSDate().dateByAddingTimeInterval(60*60*24); //60seconds*60minutes*12hours
var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!;
var unit : NSCalendarUnit = (NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit);
var comps:NSDateComponents = gregorian.components(unit, fromDate: tomorrow);
comps.setValue(12, forComponent: NSCalendarUnit.HourCalendarUnit);
comps.setValue(0, forComponent: NSCalendarUnit.MinuteCalendarUnit);
var noon_tomorrow : NSDate = gregorian.dateFromComponents(comps)!;