错误的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]);