从今天的date构build一个NSDate和一个string与时间

如果我有一个表示时间的string,比如说“10:45 am”,那么执行以下操作来parsingstring:

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

我会得到这个logging:

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

如何在给定的时间创build当天的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); 

结果

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

我应该怎么做呢?

我不完全确定你在找什么。 据我所知,你想build立一个date与当前的年,月和日,但与您提供的时间parsing它从一个string。 如果是这样的话,正如其他人所指出的,你需要玩NSDateComponents。

根据你的代码,我写了这些行。 他们应该通过合并两个date来build立一个date。 当前的和你分析的一个。

 // 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); 

请注意,这个示例代码目前还没有进行优化。 有更清晰的方式来获得你正在寻找的时间间隔,但我觉得你想要一个简单的例子,如何做组件复制和粘贴,然后提取date。

这将在当前时区中创build一天的开始date。

 NSDate *today = [NSDate date]; NSTimeInterval interval; NSCalendar *cal = [NSCalendar currentCalendar]; [cal rangeOfUnit:NSDayCalendarUnit startDate:&today interval:&interval forDate:today]; 

现在我们添加时间:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // I have to set the locale to posix_en_us, as my system is using 24hour style as default dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; [dateFormatter setDateFormat:@"hh:mm a"]; NSDate *time = [dateFormatter dateFromString:@"10:45 AM"]; NSDateComponents *comps = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:time]; NSDate *dateAndTime = [cal dateByAddingComponents:comps toDate:today options:0]; 

dateAndTime现在是今天上午10:45在当地的时区。

在debugging器中进行控制:

 po dateAndTime $0 = 0x41b7df138c00000d 2013-09-10 08:45:00 +0000 

这是正确的,因为我的时区比格林威治标准时间早2小时,因为我们还有夏令时。