错误的date从NSDateComponents回来

为什么这给了我错误的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); 

开始date是2013-06-28 03:00:00 +0000

编辑

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

例如:

开始date是2013-06-28 05:00

结束date是:2013-06-29 04:59

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

 NSComparisonResult result1 = [now compare:startDate1]; NSComparisonResult result2 = [now compare:endDate1]; if (result2 == NSOrderedSame && result1 == NSOrderedSame ) { NSLOG(@"OKE!"); } 

大概这个date是正确的,但你误解了日志:

loggingdate总是在TZ +0000中完成。 例如,如果您在中欧,您将有(预计?)date2013-06-28 05:00:00 +0200,但日志会显示规范date2013-06-28 03:00:00 +0000。 这是相同的date和时间! 它只是以不同的方式expression。

+++

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

你可以检查当前date是否在这样的两个date之间:

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

你的代码实际上检查testingdate是否等于(NSOrderedSame)到开始和结束date(当然不是这样)

 result2 == NSOrderedSame && result1 == NSOrderedSame 

看我的扩展例子:

 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 

这是因为您必须使用设备的时区打印date,否则以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]);