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

Posted

技术标签:

【中文标题】如何将 .hour() 和 .minute() 从 Swift 转换为 Objective-C?【英文标题】:How to convert .hour() and .minute() from Swift to Objective-C? 【发布时间】:2016-04-14 15:29:44 【问题描述】:

如何将 .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()

我试过这个:

- (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];

我在这些行收到以下错误:

if ([self seconds] < 30) 

NSDate 没有可见的@interface 声明选择器秒数。

return [date hour];

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

【问题讨论】:

查看NSDate 的文档。没有secondshour 这样的方法。它们必须是 Swift 代码中的自定义函数。 Please do refer this link 这显示了您的转换的明确方式[也请参考此链接][1] [1]:***.com/questions/1739383/… 我实际上已经看到了那个链接。而且我知道 swift 代码没有名为 hour() 或 seconds() 的自定义函数,这就是我感到惊讶的原因。这就是为什么我想回答我的问题。 @SridharG.K 这与这个问题无关。 @CodeOxO NSDate 上也没有 minuteInSeconds 方法,但您的代码正在调用这样的方法。它也必须是某种类别方法。 【参考方案1】:

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

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

if ([components seconds] < 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];

关于 SO 和 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

【讨论】:

解释为什么新版本(swift)比旧版本(xcode/objective c)更容易使用?他们改进了一些东西。【参考方案2】:

Apple 建议始终使用 NSCalendar 进行日期数学运算,因为例如当夏令时更改时,某些通过加/减秒计算的日期可能不存在。

nextDateAfterDate 根据指定的日期组件计算下一个日期,在这种情况下是分钟为零的下一个日期。要获取过去最近的时间,您还可以向后搜索。

斯威夫特

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];

【讨论】:

以上是关于如何将 .hour() 和 .minute() 从 Swift 转换为 Objective-C?的主要内容,如果未能解决你的问题,请参考以下文章

C程序练习

判断

EXCEL 上班时间统计表

如何从INTERVAL类型转换为NUMBER类型

PHP 时间转换 00:00:00格式

excel中怎么计算时间差?要精确到Day/Hour/Minute/Second