2016-04-14 17 views
0

Wie konvertiert man die .minute() und die .hour() in Objective-C?Wie konvertiert man .hour() und .minute() von Swift zu Objective-C?

func nearestHour() -> Int { 
    let halfHour = NSDate.minuteInSeconds() * 30 
    var interval = self.timeIntervalSinceReferenceDate 
    if self.seconds() < 30 { 
     interval -= halfHour 
    } else { 
     interval += halfHour 
    } 
    let date = NSDate(timeIntervalSinceReferenceDate: interval) 
    return date.hour() 
} 

Ich versuchte dies:

- (int) nearestHour { 
NSInteger halfHour = [NSDate minuteInSeconds].intValue * 30; 
NSTimeInterval interval = [self timeIntervalSinceReferenceDate]; 
if ([self seconds] < 30) { 
    interval -= halfHour; 
} 
else { 
    interval += halfHour; 
} 
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate: interval]; 
return [date hour]; 
} 

ich die folgenden Fehler auf diesen Linien erhalten:

if ([self seconds] < 30) { 

keine sichtbare @interface für NSDate die Wähler Sekunden erklärt.

nicht sichtbar @interface für NSDate deklariert die Selektorstunde.

+0

Schauen Sie sich die Dokumentation für 'NSDate'. Es gibt keine Methoden wie "Sekunden" oder "Stunde". Sie müssen benutzerdefinierte Funktionen in Ihrem Swift-Code sein. – rmaddy

+0

[Bitte beachten Sie diesen Link] (http://stackoverflow.com/questions/743140/how-do-i-get-the-current-hour-using-cocoa) Dies zeigt den klaren Weg zu Ihrer Konvertierung [Siehe diese Verbindung auch] [1] [1]: http://stackoverflow.com/questions/1739383/convert-seconds-integer-to-hhmm-iphone –

+0

Ich hatte tatsächlich diesen Link bereits gesehen. Und ich weiß, dass der schnelle Code keine benutzerdefinierte Funktion namens Stunde() oder Sekunden() hat, deshalb war ich überrascht. Und deshalb hätte ich gerne eine Antwort auf meine Frage. –

Antwort

0

Wie erwähnt, NSDate hat nicht die Schnittstelle, die Sie benötigen. Sie müssen es zu einer Kalenderschnittstelle ausbrechen. Dann können Sie die Stunde/Minute/Sekunde und so individuell einstellen oder bekommen Sie oder was auch immer Sie tun müssen.

NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:self]; 

if ([components seconds] < 30) { 

Für Ihr Beispiel:

- (int) nearestHour { 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:self]; 
    NSInteger halfHour = [NSDate minuteInSeconds].intValue * 30; 
    NSTimeInterval interval = [self timeIntervalSinceReferenceDate]; 
    if ([components minutes] < 30) { 
     interval -= halfHour; 
    } 
    else { 
     interval += halfHour; 
    } 
    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate: interval]; 
    return [date hour]; 
} 

Viele Beispiele auf SO und Google: How do I get the current hour using Cocoa?

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/DatesAndTimes.html#//apple%5Fref/doc/uid/10000039

+0

Erläuterung, warum die neue Version (swift) einfacher zu verwenden ist als die ältere Version (xcode/objective c)? Sie haben die Dinge verbessert. – LawfulEvil

0

Apple empfiehlt immer, weil zum Beispiel mit NSCalendar Datum Mathematik zu tun, wenn das Tageslicht Speicherzeitänderungen Einige Daten, die durch Addieren/Subtrahieren von Sekunden berechnet wurden, sind möglicherweise nicht vorhanden.

nextDateAfterDate berechnet das nächste Datum in Abhängigkeit von den angegebenen Datumskomponenten, in diesem Fall dem nächsten Datum, an dem die Minuten Null sind. Um die nächste Stunde in der Vergangenheit zu erhalten, können Sie auch rückwärts suchen.

Swift

let now = NSDate() 
let calendar = NSCalendar.currentCalendar() 
let roundDown = calendar.component(.Minute, fromDate: now) < 30 
let components = NSDateComponents() 
components.minute = 0 
let options : NSCalendarOptions = roundDown ? [.MatchNextTime, .SearchBackwards] : .MatchNextTime 
let nearestDate = calendar.nextDateAfterDate(now, matchingComponents: components, options: options)! 
let nearestHour = calendar.component(.Hour, fromDate: nearestDate) 

Objective-C

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
BOOL roundDown = [calendar component:NSCalendarUnitMinute fromDate: now] < 30 ; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.minute = 0; 
NSCalendarOptions options = roundDown ? (NSCalendarMatchNextTime | NSCalendarSearchBackwards) : NSCalendarMatchNextTime; 
NSDate *nearestDate = [calendar nextDateAfterDate:now matchingComponents: components options: options]; 
NSInteger nearestHour = [calendar component:NSCalendarUnitHour fromDate: nearestDate];