【问题标题】:NSDate with date component from one and time component from another NSDateNSDate 带有来自一个 NSDate 的日期组件和来自另一个 NSDate 的时间组件
【发布时间】:2012-06-26 05:40:01
【问题描述】:

我的应用中有两个 UIDatePicker 控件,一个配置了 UIDatePickerModeDate,一个配置了 UIDatePickerModeTime。

我想用 UIDatePicker 第一个的日期和第二个的时间配置一个 NSDate 对象......如何?

谢谢, 标记

【问题讨论】:

    标签: ios nsdate uidatepicker


    【解决方案1】:

    假设 date1 和 date2 是您的两个 NSDate 值。 date1 包含您的日期组件,而 date2 包含您的时间组件。以下是您将它们组合在一起的方法:

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    // Extract date components into components1
    NSDateComponents *components1 = [gregorianCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                                         fromDate:date1];
    
    // Extract time components into components2
    NSDateComponents *components2 = [gregorianCalendar components:NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit 
                                                         fromDate:date2];
    
    // Combine date and time into components3
    NSDateComponents *components3 = [[NSDateComponents alloc] init];
    
    [components3 setYear:components1.year];
    [components3 setMonth:components1.month];
    [components3 setDay:components1.day];    
    
    [components3 setHour:components2.hour];
    [components3 setMinute:components2.minute];
    [components3 setSecond:components2.second];         
    
    // Generate a new NSDate from components3.
    NSDate *combinedDate = [gregorianCalendar dateFromComponents:components3];   
    
    // combinedDate contains both your date and time!
    

    适用于 iOS 8.0 +

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
    // Extract date components into components1
    NSDateComponents *components1 = [gregorianCalendar components:(NSCalendarUnit)(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay)
                                                         fromDate:date1];
    
    // Extract time components into components2
    NSDateComponents *components2 = [gregorianCalendar components:(NSCalendarUnit)(NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond)
                                                         fromDate:date2];
    
    // Combine date and time into components3
    NSDateComponents *components3 = [[NSDateComponents alloc] init];
    
    [components3 setYear:components1.year];
    [components3 setMonth:components1.month];
    [components3 setDay:components1.day];
    
    [components3 setHour:components2.hour];
    [components3 setMinute:components2.minute];
    [components3 setSecond:components2.second];
    
    // Generate a new NSDate from components3.
    NSDate * combinedDate = [gregorianCalendar dateFromComponents:components3];
    
    // combinedDate contains both your date and time!
    

    【讨论】:

      【解决方案2】:

      在斯威夫特中:

      let calendar = NSCalendar.currentCalendar()
      let date1 = NSDate() // PickerDateMode
      let date2 = NSDate() // PickerHourMode
      
      let componentsOne = calendar.components([.Year, .Month, .Day], fromDate: date1)
      let componentsTwo = calendar.components([.Hour, .Minute], fromDate: date2)   
      
      let totalComponents = NSDateComponents()
      totalComponents.year = componentsOne.year
      totalComponents.month = componentsOne.month
      totalComponents.day = componentsOne.day
      totalComponents.hour = componentsTwo.hour
      totalComponents.minute = componentsTwo.minute
      
      let finalDate = calendar.dateFromComponents(totalComponents)
      

      【讨论】:

        【解决方案3】:
        NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
        NSDate *date = [NSDate date];//datapicker date
        NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
        
        NSInteger year = [dateComponents year];
        NSInteger month = [dateComponents month];
        NSInteger day = [dateComponents day];
        NSInteger hour = [dateComponents hour];
        NSInteger minute = [dateComponents minute];
        NSInteger second = [dateComponents second];
        

        【讨论】:

          【解决方案4】:

          更新到 Swift 4 和 4.1

           func combineDateAndTimeToOneDate() {
          
              let datefrmter = DateFormatter()
               datefrmter.dateFormat = "dd/MM/yyyy"
              let dateFromString = datefrmter.date(from: lblDate.text!)
          
              datefrmter.dateFormat = "h:mm a"
              let timeFromString = datefrmter.date(from: lblTime.text!)
          
              let calendar = NSCalendar.current
          
              let componentsOne = calendar.dateComponents([.year,.month,.day], from: dateFromString!)
              let componentsTwo = calendar.dateComponents([.hour,.minute,.second,.nanosecond], from: timeFromString!)
          
              let totalComponents = NSDateComponents()
              totalComponents.year = componentsOne.year!
              totalComponents.month = componentsOne.month!
              totalComponents.day = componentsOne.day!
              totalComponents.hour = componentsTwo.hour!
              totalComponents.minute = componentsTwo.minute!
              totalComponents.second = componentsTwo.second!
              totalComponents.nanosecond = componentsTwo.nanosecond!
          
              let finalDate = calendar.date(from: totalComponents as DateComponents)
              print(finalDate)
          
          }
          

          希望对你有帮助!

          【讨论】:

          • 你不需要使用NSDateComponents最后转换为DateComponents,可以使用DateComponents,只需将totalComponents改为var而不是let
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-15
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多