Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.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
Iphone NSDateComponents返回的日期错误_Iphone_Ios_Objective C_Nsdate_Nsdatecomponents - Fatal编程技术网

Iphone NSDateComponents返回的日期错误

Iphone NSDateComponents返回的日期错误,iphone,ios,objective-c,nsdate,nsdatecomponents,Iphone,Ios,Objective C,Nsdate,Nsdatecomponents,为什么这给了我错误的日期 NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];

为什么这给了我错误的日期

 NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSLog(@"start date is %@",startDate1);
开始日期为2013-06-28 03:00:00+0000

编辑

我想做的是以下几点。我有一个开始和结束

例如:

开始日期为2013-06-28 05:00

结束日期:2013-06-29 04:59

然后我想检查当前日期是否在开始日期和结束日期之间。我正在使用以下命令

NSComparisonResult result1 = [now compare:startDate1];
    NSComparisonResult result2 = [now compare:endDate1];

if (result2 == NSOrderedSame && result1 == NSOrderedSame ) {
        NSLOG(@"OKE!");
 }

可能日期是正确的,但您误解了日志:

记录日期总是在TZ+0000中完成。例如,如果您在中欧,您将拥有(预期?)日期2013-06-28 05:00:00+0200,但日志将显示标准化日期2013-06-28 03:00:00+0000。这是相同的日期和时间!它只是用一种不同的方式表达

+++


如果组件也在TZ+0000中,则应设置日历的时区。

日期可能是正确的,但您误解了日志:

记录日期总是在TZ+0000中完成。例如,如果您在中欧,您将拥有(预期?)日期2013-06-28 05:00:00+0200,但日志将显示标准化日期2013-06-28 03:00:00+0000。这是相同的日期和时间!它只是用一种不同的方式表达

+++


如果您的组件也在TZ+0000中,您应该设置日历的时区。

这是因为您必须使用设备的时区打印日期,否则它将以UTC显示

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone systemTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"%@", [formatter stringFromDate:startDate1]);

这是因为您必须使用设备的时区打印日期,否则它将以UTC显示

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone systemTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"%@", [formatter stringFromDate:startDate1]);

您可以检查当前日期是否介于两个日期之间,如下所示:

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);
您的代码实际上检查测试日期是否等于开始日期和结束日期(当然不是这样)

请参见我的扩展示例:

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
[components setYear:2013];
[components setMonth:05];
[components setDay:13];
[components setHour:18];
[components setMinute:00];
NSDate *startDate = [myCalendar dateFromComponents:components];
[components setDay:15];
NSDate *endDate = [myCalendar dateFromComponents:components];

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);

NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate);
这会将其打印到控制台:

Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000

您可以检查当前日期是否介于两个日期之间,如下所示:

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);
您的代码实际上检查测试日期是否等于开始日期和结束日期(当然不是这样)

请参见我的扩展示例:

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
[components setYear:2013];
[components setMonth:05];
[components setDay:13];
[components setHour:18];
[components setMinute:00];
NSDate *startDate = [myCalendar dateFromComponents:components];
[components setDay:15];
NSDate *endDate = [myCalendar dateFromComponents:components];

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);

NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate);
这会将其打印到控制台:

Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000

嗨,我已经编辑了我的问题,添加了更多的细节。我想我不能像你那样比较字符串?嗨,我已经用更多的细节编辑了我的问题。我想我不能像你那样比较字符串?你的日期值取决于时区。将其更改为您的本地时区将解决您的问题。设置常规日期和时间。日期值取决于时区。将其更改为您的本地时区将解决您的问题。设置常规日期和时间。