NSDate обнулять секунды без округления - PullRequest
9 голосов
/ 16 марта 2011

Я хотел бы знать, может ли кто-нибудь помочь мне с моим методом. У меня есть следующий метод, который обнуляет значение секунд объекта 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

Я не хочу, чтобы это округление происходило, поскольку именно пользователь фактически указывает дату, поэтому оно должно быть точно до той минуты, которую они запрашивают.

Любая помощь очень ценится.

Ответы [ 6 ]

29 голосов
/ 16 марта 2011

Используйте пол вместо круглых:

- (NSDate *)dateWithZeroSeconds:(NSDate *)date
{
    NSTimeInterval time = floor([date timeIntervalSinceReferenceDate] / 60.0) * 60.0;
    return  [NSDate dateWithTimeIntervalSinceReferenceDate:time];
}
24 голосов
/ 16 марта 2011

Используйте NSCalendar и NSDateComponents, чтобы получить части даты.Установите для компонента секунд значение 0, а затем создайте новую дату из этого NSDateComponents.

5 голосов
/ 26 ноября 2014

Чтобы завершить, вот код, на который ссылается iOS SDK 8.1 с использованием NSCalendar и NSDateComponents.

+ (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 названия единиц календаря изменились.

2 голосов
/ 15 августа 2015

Вы можете получить начало любой единицы времени - например, минуты - с помощью rangeOfUnit:startDate:interval:forDate:

NSDate *startOfMinuteDate;
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMinute
                                startDate:&startOfMinuteDate 
                                 interval:NULL 
                                  forDate:originalDate];
2 голосов
/ 15 августа 2015

Версия Swift 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)!

}
0 голосов
/ 12 апреля 2018

Swift 4 версия:

func truncateSecondsForDate(fromDate: Date) -> Date {

    let calendar = Calendar.current
    let fromDateComponents: DateComponents = calendar.dateComponents([.era , .year , .month , .day , .hour , .minute], from: fromDate as Date) as DateComponents

    return calendar.date(from: fromDateComponents as DateComponents)! as Date
}
...