2

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

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

我会记录下来:

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

结果

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

我该怎么办?

4

2 回答 2

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

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

于 2013-09-09T22:33:32.750 回答
3

这将为当前时区的一天的开始创建一个日期。

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。

在调试器中控制:

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

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

于 2013-09-09T22:18:40.157 回答