NSDate零秒,没有四舍五入

Mic*_*ker 9 objective-c nsdate ios4

我想知道是否有人可以用我的方法帮助我.我有以下方法,它会将NSDate对象的秒值清零:

- (NSDate *)dateWithZeroSeconds:(NSDate *)date {
    NSTimeInterval time = round([date timeIntervalSinceReferenceDate] / 60.0) * 60.0;
    return  [NSDate dateWithTimeIntervalSinceReferenceDate:time];
}
Run Code Online (Sandbox Code Playgroud)

问题是当通过日期时,例如:

2011-03-16 18:21:43 +0000
Run Code Online (Sandbox Code Playgroud)

它返回:

2011-03-16 18:22:00 +0000
Run Code Online (Sandbox Code Playgroud)

我不希望这种舍入发生,因为它是实际指定日期的用户,因此它需要精确到他们请求的那一刻.

任何帮助是极大的赞赏.

hja*_*tij 30

使用地板而不是圆形:

- (NSDate *)dateWithZeroSeconds:(NSDate *)date
{
    NSTimeInterval time = floor([date timeIntervalSinceReferenceDate] / 60.0) * 60.0;
    return  [NSDate dateWithTimeIntervalSinceReferenceDate:time];
}
Run Code Online (Sandbox Code Playgroud)

  • 不考虑闰秒:http://en.wikipedia.org/wiki/Leap_second (2认同)

Cal*_*leb 24

使用NSCalendar和NSDateComponents获取日期的各个部分.将seconds组件设置为0,然后从该NSDateComponents创建新日期.

  • @WilliamT.答案无需为您提供剪切和粘贴的代码片段以便提供帮助.知道正确的方法,一个称职的Objective-C程序员会*编写必要的代码而不是搜索它. (5认同)

Nei*_*eil 5

要完成,这里是使用NSCalendar和NSDateComponents引用iOS SDK 8.1的代码.

+ (NSDate *)truncateSecondsForDate:(NSDate *)fromDate;
{
     NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
     NSCalendarUnit unitFlags = NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
     NSDateComponents *fromDateComponents = [gregorian components:unitFlags fromDate:fromDate ];
     return [gregorian dateFromComponents:fromDateComponents];
}
Run Code Online (Sandbox Code Playgroud)

请注意,从iOS 8开始,日历单元名称已更改.