在iOS中将NSdate四舍五入到最近的小时
Posted
技术标签:
【中文标题】在iOS中将NSdate四舍五入到最近的小时【英文标题】:Rounding of NSdate to nearest hour in iOS 【发布时间】:2013-06-10 07:03:04 【问题描述】:我有格式的数据
时间:13:52、10:30、11:48
等
我想四舍五入到最接近的小时。
喜欢 13:52 -> 14:00、10:30 -> 11:00 和 11:48 -> 12:00。
如何使用 NSDate 做到这一点?
【问题讨论】:
1.将您的 NSDate 拆分为组件 2. 添加 if-else 并检查分钟是否大于 30 3. 将分钟数归零并将小时数增加一或不执行任何操作。就是这样。简单的数学:-) 【参考方案1】:这是一个使用 Date
扩展名获取最近小时的 Swift 3.0 实现:
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)
【讨论】:
是否也需要去掉秒数? 秒,我修改上面得到秒,然后将 components.seconds 设置为 -components.seconds【参考方案2】:使用这个方法
- (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 日期
【讨论】:
嘿嗨@Lithu T.v,我正在将时区设置为UTC,如果我使用你的代码,如果系统时间(印度时间)是下午6.10,我得到下午7.30,同样我改变时间在设置下的设备上将区域设置为美国,然后尝试,如果时间是上午 8.20,我会得到上午 9.00。我不明白为什么? 这更像是一个 ceil 函数。如果您有 10:15,则不会四舍五入为 10。而是改为 11:15。【参考方案3】: 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)
【讨论】:
【参考方案4】:由于以下几个原因,使用组件不可靠:
-
不考虑秒数
添加秒数时,很少会错过一秒
我在 Swift 4.* 中找到的最可靠的方法是:
extension Date
func nearestHour() -> Date
return Date(timeIntervalSinceReferenceDate:
(timeIntervalSinceReferenceDate / 3600.0).rounded(.toNearestOrEven) * 3600.0)
【讨论】:
这是基于从 00:00 开始的参考日期。但是leap seconds呢?【参考方案5】:使用下面的代码。它一定对你有帮助。
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);
【讨论】:
以上是关于在iOS中将NSdate四舍五入到最近的小时的主要内容,如果未能解决你的问题,请参考以下文章
将double转换为字符串时,如何在C#中将其四舍五入到N个小数位? [复制]