【问题标题】:Problem combining a date and a time into a single NSDate将日期和时间组合成单个 NSDate 的问题
【发布时间】:2011-05-12 14:22:48
【问题描述】:

我正在尝试使用这种方法将一个NSDate 的时间值(小时、分钟、秒)与第二个NSDate 的日期值(日、月、年)结合起来:

+ (NSDate *)combineDate:(NSDate *)date withTime:(NSDate *)time {

    NSCalendar *gregorian = [[NSCalendar alloc]
        initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *dateComponents = [gregorian components:(NSDayCalendarUnit | 
        NSWeekdayCalendarUnit) fromDate:date];
    NSDateComponents *timeComponents = [gregorian components:(NSDayCalendarUnit | 
        NSWeekdayCalendarUnit) fromDate:time];

    NSDateComponents *comp = [NSDateComponents alloc];
    [comp setSecond:[timeComponents second]];
    [comp setHour:[timeComponents hour]];
    [comp setMinute:[timeComponents minute]];
    [comp setYear:[dateComponents year]];
    [comp setMonth:[dateComponents month]];
    [comp setDay:[dateComponents day]];

    NSDate *combDate = [gregorian dateFromComponents:comp]; 

    [gregorian release];
    [comp release];

    return combDate;
}

...但是它返回的实际上是胡言乱语(例如,年份显示为“1”)。有人知道这种方法有什么问题吗?

【问题讨论】:

标签: iphone ios ipad calendar


【解决方案1】:

我使用了错误的日历组件。这是更正后的函数(现在用于 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;
}

【讨论】:

    【解决方案2】:

    Swift 3 扩展:

    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)!
    }
    

    【讨论】:

      【解决方案3】:

      它在 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)!
      }
      

      【讨论】:

        【解决方案4】:

        (Swift + 扩展)是你的朋友:

        // 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
            }
        
        }
        

        【讨论】:

        • Swift 绝对不是我的朋友。
        • @Luca 有什么理由使用公历吗?为什么不只是当前日历?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        相关资源
        最近更新 更多