如何将.hour()和.minute()从Swift转换为Objective-C?

如何将.hour()和.minute()从Swift转换为Objective-C?,objective-c,swift,nsdate,hour,seconds,Objective C,Swift,Nsdate,Hour,Seconds,如何将.minute()和.hour()转换为Objective-C func nearestHour () -> Int { let halfHour = NSDate.minuteInSeconds() * 30 var interval = self.timeIntervalSinceReferenceDate if self.seconds() < 30 { interval -= halfHour } else {

如何将.minute()和.hour()转换为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()
}

NSDate没有可见的@interface声明选择器小时。

如前所述,NSDate没有您需要的界面。您需要将其拆分为日历界面。然后,您可以单独设置小时/分钟/秒等,或者获取它们或您需要执行的任何操作

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

if ([components seconds] < 30) {
NSDateComponents*components=[[NSCalendar currentCalendar]components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)fromDate:self];
如果([组件秒]<30){
例如:

- (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];
}
-(int)最近一小时{
NSDateComponents*components=[[NSCalendar currentCalendar]components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)fromDate:self];
NSInteger半小时=[NSDate MINUTEINSECONS].intValue*30;
NSTimeInterval interval=[self-timeIntervalSinceReferenceDate];
如果([组件分钟]<30){
间隔时间-=半小时;
}
否则{
间隔时间+=半小时;
}
NSDate*date=[NSDate date WITHTIMEIntervalsIncerenceDate:interval];
返回[日期小时];
}
SO和google上有很多例子:


苹果公司建议始终使用
NSCalendar
进行日期计算,因为例如,当夏令时发生变化时,通过加减秒计算的某些日期可能不存在

nextDateAfterDate
根据指定的日期组件计算下一个日期,在本例中为分钟为零的下一个日期。若要获取过去最近的小时数,还可以向后搜索

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)
let now=NSDate()
让calendar=NSCalendar.currentCalendar()
让roundDown=calendar.component(.Minute,fromDate:now)<30
let components=NSDateComponents()
组件。分钟=0
让选项:NSCalendarOptions=roundDown?[.MatchNextTime、.SearchBackwards]:.MatchNextTime
让nearestDate=calendar.nextDateAfterDate(现在,匹配组件:组件,选项:选项)!
设nearestHour=calendar.component(.Hour,fromDate:nearestDate)
目标-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];
NSDate*now=[NSDate-date];
NSCalendar*日历=[NSCalendar currentCalendar];
BOOL roundDown=[日历组件:nsCalendarUnitMinutefromDate:now]<30;
NSDateComponents*components=[[NSDateComponents alloc]init];
组件。分钟=0;
NSCalendarOptions=roundDown?(NSCalendarMatchNextTime | NSCalendarSearchBackwards):NSCalendarMatchNextTime;
NSDate*nearestDate=[calendar NextDate Afterdate:现在匹配组件:组件选项:选项];
NSInteger nearestHour=[日历组件:NSCalendarUnitHour fromDate:nearestDate];

查看有关
NSDate
的文档。没有
小时
等方法。它们必须是Swift代码中的自定义函数。这显示了转换的明确方式[也请参阅此链接][1][1]:我实际上已经看到了该链接。我知道swift代码没有名为hour()或seconds()的自定义函数,这就是我为什么感到惊讶的原因。这就是为什么我想要我的问题的答案。@SridharG.K这与这个问题无关。@CodeOxO在
NSDate
上也没有
minuteInSeconds
方法,但您的代码正在调用这样一个方法。它也必须是某种类别方法。解释新版本的原因(swift)比旧版本(xcode/objective c)更易于使用?它们改进了一些东西。
- (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];
}
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)
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];