Make a new NSDate by combining two NSDates
I have NSDate* day1
and NSDate* day2
. How开发者_JAVA技巧 can I make a NSDate* day3
by copying only year/month/day from day1 and hour/minute/second from day2?
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];
Sources:
- NSDateComponents Class Reference
- NSCalendar Class Reference
It's not as compact as darvids0n's, but it works.
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];
or
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];
You need to create an NSCalendar and then get the date components from the first and second dates and then get the date using the new date components from the NSCalendar.
Use the NSCalendar methods
– components:fromDate:
– dateFromComponents:
and the corresponding unit flags
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit;
For the records, here is a more general approach
@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
You can call it like this
NSDate *day3 =
[day2 dateByTakingComponents: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
fromDate: day1];
Update 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)
}
精彩评论