【问题标题】:How to compose date from first NSDate and time from second NSDate into one NSDate?如何将第一个 NSDate 的日期和第二个 NSDate 的时间组合成一个 NSDate?
【发布时间】:2015-03-05 09:05:22
【问题描述】:

我需要一件事:

  • 创建一个输出NSDate,包括它们,格式为:"yyyy-MM-dd HH:mm:00",其中yyyy-MM-dd来自第一个NSDateHH:mm:00来自第二个NSDate

【问题讨论】:

  • 你有什么尝试吗?你是怎么得到这两个数据的?
  • 您写到有两种输出格式。你没有写任何关于有两个日期的东西。有区别。你有两个字符串的日期吗?
  • NSDateComponents 可能是NSDate 的一种方式,否则如果它们是NSString,则附加字符串,然后使用NSDateFormatter
  • 我有两个按钮,一个用于日期,一个用于时间。当我点击其中一个时,我有一个弹出框并选择时间或日期(取决于按钮的类型)。
  • 然后合并成一个字符串,并使用NSDateFormatter 从该字符串中获取NSDate 实例...在此过程中您会遇到哪些困难?

标签: ios swift nsdate


【解决方案1】:

您可以通过创建便利初始化程序轻松实现此目的,如下所示:

convenience init(date: NSDate?, time: NSDate?) {
    var combinedDate = NSDate()

    if let date = date {
        if let time = time {
            let calendar = NSCalendar.currentCalendar()
            let timeComponents = calendar.components(.HourCalendarUnit | .MinuteCalendarUnit | .TimeZoneCalendarUnit, fromDate: time)
            var dateComponents = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date)
            dateComponents.hour = timeComponents.hour
            dateComponents.minute = timeComponents.minute
            dateComponents.second = 0
            dateComponents.timeZone = timeComponents.timeZone

            if let dateFromComponents = calendar.dateFromComponents(dateComponents) {
                combinedDate = dateFromComponents
            }
        }
    }

    self.init(timeInterval:0, sinceDate: combinedDate)
}

基本上,它由两个日期的组件组成一个日期。例如,从第二个 NSDate 开始需要小时、分钟和秒,称为 time,从第一个 NSDate 开始需要年、月和日,称为 date

您可以修改组件以使其或多或少准确。您甚至可以扩展初始化程序以包含日历的自定义单位。

【讨论】:

    【解决方案2】:

    使用此代码

    + (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;
    }
    

    可以帮到你

    【讨论】:

      【解决方案3】:

      Swift 5 版本:

          init?(date: Date, time: Date) {
          let calendar = Calendar.current
          let timeComponents = calendar.dateComponents([.hour, .minute, .timeZone], from: time)
          var dateComponents = calendar.dateComponents([.year, .month, .day], from: date)
          dateComponents.hour = timeComponents.hour
          dateComponents.minute = timeComponents.minute
          dateComponents.second = 0
          dateComponents.timeZone = timeComponents.timeZone
      
          guard let combined = calendar.date(from: dateComponents) else { return nil }
          self = combined
      }
      

      【讨论】:

        【解决方案4】:

        假设你有两个字符串:

        NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
        [dateformate setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        
        NSString *outputDate = [dateformate dateFromString:[@"2015-09-01" stringByAppendingString:@"08:33:00"]];
        

        【讨论】:

          猜你喜欢
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-28
          • 2011-09-29
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          相关资源
          最近更新 更多