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