6 Stimmen

NSDate für "Beginn der nächsten Stunde"

Ich würde gerne einen Countdown bis zur nächsten vollen Stunde erstellen. Es ist ziemlich einfach, einen Countdown für eine bestimmte Zeit zu erstellen, z. B:

NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 

Wie definiere ich ein NSDate für "den Beginn jeder Stunde"?

Danke!

EDIT: Das ist, was ich derzeit habe. Ich habe Probleme, die Lösungen in meinen Code zu integrieren. Jede Hilfe wäre sehr zu schätzen :)

-(void)updateLabel {
NSDate *now = [NSDate date];

NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 

//num of seconds between mid and now
NSTimeInterval timeInt = [midnight timeIntervalSinceDate:now];
int hour = (int) timeInt/3600;
int min = ((int) timeInt % 3600) / 60;
int sec = (int) timeInt % 60;
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec];
}

17voto

Vladimir Punkte 169002

Als +dateWithNaturalLanguageString nur im MacOS SDK verfügbar ist und Sie auf das iPhone abzielen, müssen Sie eine eigene Methode entwickeln. Ich denke NSCalendar Klasse kann Ihnen helfen:

- (NSDate*) nextHourDate:(NSDate*)inDate{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components: NSEraCalendarUnit|NSYearCalendarUnit| NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit fromDate: inDate];
    [comps setHour: [comps hour]+1]; // Here you may also need to check if it's the last hour of the day
    return [calendar dateFromComponents:comps];
}

Ich habe diesen Code nicht überprüft, aber er (zumindest dieser Ansatz) muss funktionieren.

7voto

dulgan Punkte 6593

Mit DateComponents und Date erhalten Sie es, indem Sie eine negative Anzahl von Minuten und eine Stunde zu dem angegebenen Datum hinzufügen.

Swift3 (als Erweiterung):

extension Date {
    public var nextHour: Date {
        let calendar = Calendar.current
        let minutes = calendar.component(.minute, from: self)
        let components = DateComponents(hour: 1, minute: -minutes)
        return calendar.date(byAdding: components, to: self) ?? self
    }
}

Verwenden Sie es mit let nextHourDate = myDate.nextHour

Siehe Apfel Datum und Uhrzeit Programmieranleitung als Referenz.

\===========================================================================

ObjectiveC (als statische Methode):

+ (NSDate *)nextHourDate:(NSDate *)date{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:NSMinuteCalendarUnit|NSHourCalendarUnit fromDate:date];
    components.minute = -components.minute;
    components.hour = 1;
    return [calendar dateByAddingComponents:components toDate:date options:0];
}

Und rufen Sie es mit :

[YourClass nextHourDate:yourDate];

6voto

Rob Zombie Punkte 11705

Der einfachste Weg ist wahrscheinlich, den Zeitstempel zu manipulieren, ihn auf den Beginn der aktuellen Stunde zu runden und 1 Stunde hinzuzufügen

- (NSDate*)nextHourDateForDate:(NSDate*)date {
    NSTimeInterval timestamp = [date timeIntervalSince1970];
    NSTimeInterval current = timestamp - fmod(timestamp, 3600);
    NSTimeInterval next = current + 3600;

    return [NSDate dateWithTimeIntervalSince1970:next];
}

3voto

xyzzycoder Punkte 1821

Das sollten Sie sich vielleicht ansehen. Erica Sadun hat einige Erweiterungen für NSDate veröffentlicht.

http://github.com/erica/NSDate-Extensions

1voto

Davy Smith Punkte 11

Ich denke, dies würde funktionieren (Anmerkung: sehr kurz getestet)

NSDateFormatter *currentSecondFormatter = [[NSDateFormatter alloc] init];
[currentSecondFormatter setDateFormat:@"ss"];
NSDateFormatter *currentMinuteFormatter = [[NSDateFormatter alloc] init];
[currentMinuteFormatter setDateFormat:@"mm"];

// get next hour from now
int timeUntilNextHour = ( (60 - [[currentMinuteFormatter stringFromDate:[NSDate date]] integerValue]) * 60) -  [[currentSecondFormatter stringFromDate:[NSDate date]] integerValue];

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