2011-03-16 85 views
9

我想知道是否有人可以幫我用我的方法。我有以下方法,該方法將爲零輸出一個的NSDate對象的秒值:NSDate零秒沒有四捨五入

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

問題是,當過去的日期,例如:

2011-03-16 18:21:43 +0000 

它返回:

2011-03-16 18:22:00 +0000 

我不希望發生這種四捨五入,因爲它實際上是指定日期的用戶,所以它需要精確到他們請求的分鐘。

任何幫助,非常感謝。

回答

29

使用地板,而不是圓:

- (NSDate *)dateWithZeroSeconds:(NSDate *)date 
{ 
    NSTimeInterval time = floor([date timeIntervalSinceReferenceDate]/60.0) * 60.0; 
    return [NSDate dateWithTimeIntervalSinceReferenceDate:time]; 
} 
+0

+1這可能比干擾NSDateComponents的工作少。如果你想將分鐘或小時數而不是秒數計算出來,它將不起作用,但這裏應該沒問題,因爲秒數是NSDate的基本單位。 – Caleb 2011-03-16 18:35:12

+2

不計算閏秒:http://en.wikipedia.org/wiki/Leap_second – 2014-07-30 23:50:01

+1

@DarcyRayner:Cocoa的API基於NTP,因此無論如何內置API都不佔用閏秒。 – dreamlax 2015-09-16 12:20:56

24

使用NSCalendar和NSDateComponents獲取日期的各個部分。將秒組件設置爲0,然後從該NSDateComponents創建一個新日期。

+0

不是非常有幫助的時候,我們還是要最終尋找代碼來做到這一點。 – 2015-03-27 03:34:04

+5

@WilliamT。答案不需要提供代碼片段來剪切和粘貼以獲得幫助。知道正確的方法,合格的Objective-C程序員將*寫*必要的代碼而不是搜索它。 – Caleb 2015-03-27 04:46:16

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

請注意,從iOS 8開始,日曆單元名稱已更改。

+0

謝謝,這可以幫助我! – Tommy 2016-07-20 02:54:19

1

雨燕2.2版本@Neil答案:

func truncateSecondsForDate(fromDate: NSDate) -> NSDate { 

    let calendar : NSCalendar = NSCalendar.currentCalendar() 
    let unitFlags : NSCalendarUnit = [.Era , .Year , .Month , .Day , .Hour , .Minute] 
    let fromDateComponents: NSDateComponents = calendar.components(unitFlags, fromDate: fromDate) 

    return calendar.dateFromComponents(fromDateComponents)! 

} 
2

您可以得到任何時間單位的開始 - 比如分鐘 - 與rangeOfUnit:startDate:interval:forDate:

NSDate *startOfMinuteDate; 
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMinute 
           startDate:&startOfMinuteDate 
           interval:NULL 
            forDate:originalDate];