从今天的日期构造一个NSDate和一个带有时间的字符串

2 cocoa-touch date objective-c nsdate ios

如果我有一个表示时间的字符串,请说"上午10:45",并执行以下操作来解析字符串:

NSDateFormatter *dateFormat;
dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"h:mm a"];
NSLog(@"%@", [dateFormat dateFromString:@"10:45 AM"]);
Run Code Online (Sandbox Code Playgroud)

我会记录下来的:

2013-09-09 17:52:30.416 TimeTest [49491:a0b] 2000-01-01 15:45:00 +0000

如何NSDate在给定时间创建当天?我试过这个

NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"];
NSDate *time = [formatter dateFromString:@"10:45 AM"];
NSDateComponents *timeComponents = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit ) fromDate:time];
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
NSDateComponents *newComponents = [[NSDateComponents alloc]init];
newComponents.timeZone = [NSTimeZone systemTimeZone];
[newComponents setDay:[dateComponents year]];
[newComponents setMonth:[dateComponents month]];
[newComponents setYear:[dateComponents year]];
[newComponents setHour:[timeComponents hour]];
[newComponents setMinute:[timeComponents minute]];
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *combinedDate = [gregorianCalendar dateFromComponents:newComponents];
NSLog(@"%@", combinedDate);
Run Code Online (Sandbox Code Playgroud)

结果

2013-09-09 19:57:14.506 TimeTest [49712:a0b] 2019-03-06 15:45:00 +0000

我该怎么办呢?

Ric*_*nna 6

我不确定你在找什么.根据我的理解,您希望使用当前年,月和日构建日期,但是通过从字符串解析它来提供您所提供的时间.如果是这种情况,正如其他人指出的那样,您需要使用NSDateComponents.

根据你的代码我写了这些行.他们应该通过合并两个日期来建立日期.当前的一个和你解析的一个.

// Get the full current date
NSDate *date = [NSDate date];

// Get the current calendar
NSCalendar *calendar = [NSCalendar currentCalendar];

// Split the date into components but only take the year, month and day and leave the rest behind
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];

// Build the date formatter
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"];

// Convert the string time into an NSDate
NSDate *time = [formatter dateFromString:@"10:45 AM"];

// Split this one in components as well but take the time part this time
NSDateComponents *timeComponents = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit ) fromDate:time];

// Do some merging between the two date components
dateComponents.hour = timeComponents.hour;
dateComponents.minute = timeComponents.minute;

// Extract the NSDate object again
NSDate *result = [calendar dateFromComponents:dateComponents];

// Check if this was what you where looking for
NSLog(@"%@",result);
Run Code Online (Sandbox Code Playgroud)

请注意,此示例代码目前尚未优化.通过使用时间间隔,有更多清晰的方法可以获得您正在寻找的内容,但我觉得您想要一个关于如何进行组件复制和粘贴然后提取日期的简单示例.