Problem combining a date and a time into a single NSDate

前端 未结 4 906
梦毁少年i
梦毁少年i 2020-12-15 22:33

I am trying to combine the time value (hours, minutes, seconds) of one NSDate with the date value (day, month, year) of a second NSDate with this m

相关标签:
4条回答
  • 2020-12-15 23:02

    I was using the wrong calendar components. Here's the corrected function (now for ARC):

    + (NSDate *)combineDate:(NSDate *)date withTime:(NSDate *)time {
    
        NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:
            NSGregorianCalendar];
    
        unsigned unitFlagsDate = NSYearCalendarUnit | NSMonthCalendarUnit 
            |  NSDayCalendarUnit;
        NSDateComponents *dateComponents = [gregorian components:unitFlagsDate 
            fromDate:date];
        unsigned unitFlagsTime = NSHourCalendarUnit | NSMinuteCalendarUnit 
            |  NSSecondCalendarUnit;
        NSDateComponents *timeComponents = [gregorian components:unitFlagsTime 
            fromDate:time];
    
        [dateComponents setSecond:[timeComponents second]];
        [dateComponents setHour:[timeComponents hour]];
        [dateComponents setMinute:[timeComponents minute]];
    
        NSDate *combDate = [gregorian dateFromComponents:dateComponents];   
    
        return combDate;
    }
    
    0 讨论(0)
  • 2020-12-15 23:12

    Swift 3 extension:

    func combineDateAndTime(date: Date, time: Date) -> Date {
    
        let calendar = NSCalendar.current
    
        let dateComponents = calendar.dateComponents([.year, .month, .day], from: date)
        let timeComponents = calendar.dateComponents([.hour, .minute, .second], from: time)
    
        var components = DateComponents()
        components.year = dateComponents.year
        components.month = dateComponents.month
        components.day = dateComponents.day
        components.hour = timeComponents.hour
        components.minute = timeComponents.minute
        components.second = timeComponents.second
    
        return calendar.date(from: components)!
    }
    
    0 讨论(0)
  • 2020-12-15 23:14

    Here it is in Swift 2

    func combineDateAndTime(date: NSDate, time: NSDate) -> NSDate {
    
        let calendar = NSCalendar.currentCalendar()
        let dateComponents = calendar.components([.Year, .Month, .Day], fromDate: date)
        let timeComponents = calendar.components([.Hour, .Minute, .Second], fromDate: time)
    
        let components = NSDateComponents()
        components.year = dateComponents.year
        components.month = dateComponents.month
        components.day = dateComponents.day
        components.hour = timeComponents.hour
        components.minute = timeComponents.minute
        components.second = timeComponents.second
    
        return calendar.dateFromComponents(components)!
    }
    
    0 讨论(0)
  • 2020-12-15 23:20

    (Swift + extension) are your friend:

    // MARK: - NSDate extension -
    
    extension NSDate {
    
        static func combineDate(date date: NSDate, withTime time: NSDate) -> NSDate? {
            let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    
            let dateComponents = gregorian?.components([.Year, .Month, .Day], fromDate: date)
            let timeComponents = gregorian?.components([.Hour, .Minute, .Second], fromDate: date)
    
            dateComponents?.second = timeComponents?.second ?? 0
            dateComponents?.minute = timeComponents?.minute ?? 0
            dateComponents?.hour = timeComponents?.hour ?? 0
    
            if let _ = dateComponents {
                return gregorian?.dateFromComponents(dateComponents!)
            }
            return nil
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题