我有以下格式的数据
时间:13:52、10:30、11:48
等等
我想四舍五入到最接近的小时。
例如 13:52 -> 14:00、10:30 -> 11:00 和 11:48 -> 12:00。
如何使用 NSDate 做到这一点?
这是一个 Swift 3.0 实现,它使用
Date
扩展获取最接近的小时:
extension Date {
func nearestHour() -> Date? {
var components = NSCalendar.current.dateComponents([.minute], from: self)
let minute = components.minute ?? 0
components.minute = minute >= 30 ? 60 - minute : -minute
return Calendar.current.date(byAdding: components, to: self)
}
}
使用这个方法
- (NSDate*) nextHourDate:(NSDate*)inDate{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components: NSEraCalendarUnit|NSYearCalendarUnit| NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit fromDate: inDate];
[comps setHour: [comps hour]+1]; //NSDateComponents handles rolling over between days, months, years, etc
return [calendar dateFromComponents:comps];
}
这将为您提供 inDate 下一小时的日期
func nextHourDate() -> NSDate? {
let calendar = NSCalendar.currentCalendar()
let date = NSDate()
var minuteComponent = calendar.components(NSCalendarUnit.MinuteCalendarUnit, fromDate: date)
let components = NSDateComponents()
components.minute = 60 - minuteComponent.minute
return calendar.dateByAddingComponents(components, toDate: date, options: nil)
}
由于以下几个原因,使用组件并不可靠:
我在 Swift 4.* 中找到的最可靠的方法是:
extension Date {
func nearestHour() -> Date {
return Date(timeIntervalSinceReferenceDate:
(timeIntervalSinceReferenceDate / 3600.0).rounded(.toNearestOrEven) * 3600.0)
}
}
使用下面的代码。一定对你有帮助。
NSString *dateString=@"17:15";
NSArray *strings = [dateString componentsSeparatedByString:@":"];
int firstPart=[[NSString stringWithFormat:@"%@",strings[0]] intValue];
int lastPart=[[NSString stringWithFormat:@"%@",strings[1]] intValue];
NSLog(@"LAST:%d",firstPart);
if (lastPart>0) {
int output=firstPart+1;
NSString *finalOutput=[NSString stringWithFormat:@"%d:00",output];
NSLog(@"OUTPUT:%@",finalOutput);
}
else
{
NSLog(@"OUTPUT:%@",dateString);
}
这是 Swift 4/5 版本 -
func nextHourDate() -> Date? {
let calendar = Calendar.current
let date = Date()
var minuteComponent = calendar.component(.minute, from: date)
var components = DateComponents()
components.minute = 60 - minuteComponent
return calendar.date(byAdding: components, to: date)
}
func nextHour() -> Date? {
guard let date = Calendar.current.date(byAdding: .hour, value: 1, to: self) else { return nil }
return Calendar.current.dateComponents([.era, .year, .month, .day, .hour], from: date).date
}