2011-03-16 9 views
9

누군가 내 방법으로 나를 도울 수 있는지 알고 싶습니다.반올림하지 않고 NSDate 제로 아웃

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

가 반환 :

2011-03-16 18:22:00 +0000 
문제는 같은 날짜를 전달

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

: 나는 다음과 같은 방법,있는 NSDate 객체의 초 값을 제로 것이다있다

날짜를 실제로 지정하는 사용자이므로이 반올림이 필요하지 않으므로 요청한 시간과 정확히 일치해야합니다.

도움을 주시면 대단히 감사하겠습니다.

답변

29

사용 층 :

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

+1 NSDateComponents를 사용하는 것보다 덜 효과적 일 수 있습니다. 그것은 초 대신에 분 또는 시간을 제로로 만들고 싶다면 작동하지 않을 것입니다.하지만 초는 NSDate의 기본 단위이기 때문에 여기에서 괜찮습니다. – Caleb

+2

윤년을 고려하지 않음 : http://en.wikipedia.org/wiki/Leap_second –

+1

@DarcyRayner : Cocoa의 API는 NTP를 기반으로하므로 기본 제공 API 중 아무 것도 윤초를 고려하지 않습니다. – dreamlax

24

NSCalendar 및 NSDateComponents를 사용하여 날짜 부분을 가져옵니다. 초 구성 요소를 0으로 설정 한 다음 해당 NSDateComponents에서 새 날짜를 만듭니다. 대신 라운드의

+0

매우 도움이 안와 결국 코드 검색을 끝내야합니다. –

+5

@ 윌리엄. 도움이 될 수 있도록 잘라내어 붙여 넣기 할 수있는 코드 스 니펫을 제공 할 필요가 없습니다. 올바른 접근 방식을 알고 있으면 유능한 Objective-C 프로그래머가 필요한 코드를 검색하기보다는 * 써야합니다. – Caleb

5

가 완료하려면, 여기 NSCalendar과 NSDateComponents를 사용하여 아이폰 OS 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부터는 캘린더 유닛 이름이 변경되었습니다. @Neil 응답의

+0

감사합니다. – Tommy

1

스위프트 2.2 버전 : 당신은 어떤 시간 단위의 시작을 얻을 수

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