2013-05-13 2 views
0

잘못된 날짜가 표시되는 이유는 무엇입니까?NSDateComponents에서 잘못된 날짜가 반환됩니다.

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년 6월 28일 3시 0분 0초 0000

입니다. 나는 시작과 끝이있다. 2013년 6월 28일 5시

종료 날짜는

시작 날짜 : 예를 들어

이 2013년 6월 29일 4시 59분

그럼 내가 현재 여부를 확인하려면 날짜는 시작일과 종료일 사이입니다. 나는 다음을 사용하고있다.

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

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

당신의 날짜 값은 시간대에 따라 달라집니다. 문제를 해결할 현지 시간대로 변경하십시오. 설정 - 일반 - 날짜 및 시간. – brianLikeApple

답변

3

아마 날짜가 정확한지,하지만 당신은 로그 오해 : 항상 TZ 0000에서 이루어집니다

날짜를 로깅합니다. 예를 들어, 중부 유럽에 거주하는 경우 2013-06-28 05:00:00 +0200의 (예상?) 날짜가 표시되지만 로그에는 정상 날짜가 표시됩니다. 2013-06-28 03:00:00 +0000. 이것은 같은 날짜와 시간입니다! 그것은 단순히 다른 방식으로 표현됩니다. +++

당신의 구성 요소가 TZ 0000에있는 경우

역시 당신은 달력의 시간대를 설정해야합니다.

0

기기의 시간대를 사용하여 날짜를 인쇄해야하기 때문입니다. 그렇지 않으면 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]); 
+0

안녕하세요, 제 질문을 조금 더 자세히 편집했습니다. 나는 네가하는 것처럼 끈을 비교할 수 없다고 생각해? – Steaphann

1

당신은 현재의 날짜가 같은 두 날짜 사이에 있는지 여부를 확인할 수 있습니다

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

에 코드를 실제로 모두 인 (시작 및 종료 날짜에 시험 날짜가 EQUAL (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); 
:하지의 과정)

result2 == NSOrderedSame && result1 == NSOrderedSame 

내 확장 된 예를 참조하십시오

이 콘솔이를 출력 :

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 
관련 문제