Frage

Wie setze ich eine vorhandene NSDateZeit?

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:

  1. dateFromComponents: - Ich müsste alle Komponenten ausarbeiten, damit dies funktioniert, was wie Overkill erscheint
  2. dateByAddingComponents:toDate:options: - Ich möchte nicht in meinem Fall hinzufügen, sondern die Zeit "festlegen".
War es hilfreich?

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, NSDateComponentsignoriert 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)!;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top