Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从今天开始构建NSDate';s日期和带时间的字符串_Ios_Objective C_Cocoa Touch_Date_Nsdate - Fatal编程技术网

Ios 从今天开始构建NSDate';s日期和带时间的字符串

Ios 从今天开始构建NSDate';s日期和带时间的字符串,ios,objective-c,cocoa-touch,date,nsdate,Ios,Objective C,Cocoa Touch,Date,Nsdate,如果我有一个表示时间的字符串,请说“10:45 am”,然后执行以下操作来解析该字符串: NSDateFormatter *dateFormat; dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"h:mm a"]; NSLog(@"%@", [dateFormat dateFromString:@"10:45 AM"]); 我会把这个记录下来: 2013-09-09 17:52:30.416时间测

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

NSDateFormatter *dateFormat;
dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"h:mm a"];
NSLog(@"%@", [dateFormat dateFromString:@"10:45 AM"]);
我会把这个记录下来:

2013-09-09 17:52:30.416时间测试[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时间测试[49712:a0b]2019-03-06 15:45:00+0000


我应该怎么做?

这将在当前时区中创建一天开始的日期

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个小时,因为我们还有夏季时间。

我不太确定您要找什么。据我所知,您希望使用当前的年、月和日构建一个日期,但是通过从字符串解析它来使用您提供的时间。 如果是这种情况,正如其他人所指出的,您需要使用NSDATE组件

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

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

请注意,这个示例代码到目前为止还没有经过优化。通过使用时间间隔,您可以获得更清晰的方法,但我觉得您需要一个简单的示例,介绍如何复制和粘贴组件,然后提取日期。

使用NSDateComponents,或者格式化当前日期,附加到时间,然后转换回NSDate。
[NSDate date]
是当前日期+时间;它将(可能)被记录在不同的时区,但是。Null被记录,而不是根据你的答案更新我的问题,但仍然不起作用哇,nvm意外地将年份改为dayHi,对不起,我的不好。我写错了上次的转换。我修改并测试了代码。它现在正确地记录了日期。