如何将 .hour() 和 .minute() 从 Swift 转换为 Objective-C?
How to convert .hour() and .minute() from Swift to Objective-C?
如何将 .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 没有您需要的界面。您需要将其分解为日历界面。然后您可以单独设置 hour/minute/seconds 等,或者获取它们或您需要做的任何事情。
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?
Apple 建议始终使用 NSCalendar
进行日期计算,因为例如,当夏令时更改时,某些按 adding/subtracting 秒计算的日期可能不存在。
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)
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];
如何将 .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 没有您需要的界面。您需要将其分解为日历界面。然后您可以单独设置 hour/minute/seconds 等,或者获取它们或您需要做的任何事情。
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?
Apple 建议始终使用 NSCalendar
进行日期计算,因为例如,当夏令时更改时,某些按 adding/subtracting 秒计算的日期可能不存在。
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)
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];