NSDate真的很奇怪

我有时间: 7:46 am

我想将其转换为NSDate。 我这样做:

 NSDateFormatter *f = [NSDateFormatter new]; [f setDateFormat:@"h:mm a"]; NSDate *sr = [f dateFromString:@"7:46 am"]; 

我NSLog sr和我得到1969-12-31 22:46:00 +0000

那些时间不一样。 为什么这么搞砸了?

不,这并不奇怪。 NSDateConverter和NSDate正在这里做他们预期的工作。

您正在尝试将"7:46 am"转换为日期。 它只包含时间。 字符串中未指定日期。 如果未指定日期,NSDate将默认为"1970-01-01" (Unix纪元)。 因此,在转换字符串后,您将获得日期"1970-01-01 7:46 am" 。 当您尝试在NSLog中显示此项时,if将在调整timeZone偏移值后显示日期。 我想你住在日本或韩国。 您所在地区的偏差可能是+09:00。 所以它显示减去偏移量的日期。 所以你在日志中看到"1969-12-31 22:46:00 +0000"

您可以使用以下方法将该时间设置为特定日期,可能是今天

 NSString *timeStr = @"7:46 am"; NSDateFormatter *f = [NSDateFormatter new]; [f setDateFormat:@"yyyy-MM-dd"]; NSString *dateStr = [f stringFromDate:[NSDate date]]; // dateStr = 2011-06-10 dateStr = [dateStr stringByAppendingFormat:@" %@", timeStr]; // dateStr = 2011-06-10 7:46 am [f setDateFormat:@"yyyy-MM-dd h:mm a"]; NSDate *sr = [f dateFromString:dateStr]; 

您没有提供日期或时区…假设您想表达“今天上午7:42”,您可以使用此代码:

 NSDate *currentDate = [NSDate date]; NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setHour:7]; [comps setMinute:42]; NSDate *myDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0]; [comps release]; 

myDate的NSLog现在应该给你预期的输出(假设你今天想要@ 7:46 am)。

由于您只指定了您希望NSDate引用的时间而不是日期,因此格式化程序使用的是默认日期(它似乎非常接近UNIX纪元)。 像Julio说的那样,如果你想让NSDate参考那个特定日期的时间,你也应该指定当前日期。