通过组合两个NSDate创建一个新的NSDate

时间:2011-03-14 23:48:31

标签: objective-c cocoa macos nsdate

我有NSDate* day1NSDate* day2。如何从第1天开始仅复制年/月/日,从第2天复制小时/分钟/秒?

5 个答案:

答案 0 :(得分:17)

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:day1];
NSDate *day3 = [[NSCalendar currentCalendar] dateFromComponents:comps];

unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:day2];
day3 = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:day3 options:0];

来源:

  1. NSDateComponents Class Reference
  2. NSCalendar Class Reference

答案 1 :(得分:1)

它不像darvids0n那样紧凑,但它有效。

NSDate* day1 = [datePicker dateValue];
NSDate* day2 = [NSDate date];

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:day1;
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];

components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit fromDate:day2];
NSInteger hour = [components hour];    
NSInteger minute = [components minute];
NSInteger second = [components second];

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:day];
[comps setMonth:month];
[comps setYear:year];
[comps setHour:hour];
[comps setMinute:minute];
[comps setSecond:second];
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *day3 = [cal dateFromComponents:comps];

NSDateFormatter *tempFormatter = [[[NSDateFormatter alloc]init]autorelease];
[tempFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString* message = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second];
NSDate *day3 = [tempFormatter dateFromString:message];

答案 2 :(得分:0)

您需要创建一个NSCalendar,然后从第一个和第二个日期获取日期组件,然后使用NSCalendar中的新日期组件获取日期。

使用NSCalendar方法

– components:fromDate:
– dateFromComponents:

和相应的单位标志

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit; 

答案 3 :(得分:0)

对于记录,这是一种更通用的方法

@implementation NSDate (Additions)

- (void)assignFlags:(NSUInteger)unitFlags to:(NSDateComponents *)components {
  NSDateComponents *myComponents = 
        [[NSCalendar currentCalendar] components: unitFlags
                                        fromDate: self];
  if (unitFlags & NSYearCalendarUnit)
    [components setYear: [myComponents year]];
  if (unitFlags & NSMonthCalendarUnit)
    [components setMonth: [myComponents month]];
  if (unitFlags & NSDayCalendarUnit)
    [components setDay: [myComponents day]];
  if (unitFlags & NSHourCalendarUnit)
    [components setHour: [myComponents hour]];
  if (unitFlags & NSMinuteCalendarUnit)
    [components setMinute: [myComponents minute]];
  if (unitFlags & NSSecondCalendarUnit)
    [components setSecond: [myComponents second]];
}

- (NSDate *)dateByTakingComponents:(NSUInteger)unitFlags fromDate:(NSDate *)date {

  NSUInteger allFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |
    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

  NSDateComponents *allComponents = [[NSDateComponents alloc] init];
  [date assignFlags: unitFlags to: allComponents];
  [self assignFlags: allFlags & ~unitFlags to: allComponents];

  NSDate *result = [[NSCalendar currentCalendar] dateFromComponents: allComponents];
  [allComponents release];

  return result;
}

@end

你可以这样称呼它

NSDate *day3 = 
    [day2 dateByTakingComponents: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                        fromDate: day1];

答案 4 :(得分:0)

更新Swift 4& 4.1

 func combineDateAndTimeToOneDateForAPI() {

    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)

}