如何将第一个 NSDate 的日期和第二个 NSDate 的时间组合成一个 NSDate



我需要一件事:

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

您可以通过创建一个方便的初始值设定项轻松实现此目的,如下所示:

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开始获取小时、分钟和秒,从第一个NSDate调用日期开始获取年、月和日。

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

使用了这段代码

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

可能对你有所帮助

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
}

假设您有两个字符串:

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

最新更新