2016-08-10 2 views
0

날짜가 정수 속성 day of the yearyear (실제 "천재"디자인 ...)에 저장되는 기존 데이터 객체에 대한 GUI를 작성하고 있습니다.Objective-C : 주어진 날짜와 연말 연시

어떻게하면이 데이터를 해당 연도의 요일과 월로 변환 할 수 있습니까?

나는 현재 노력하고있어 :

int theYear = 2016; 
int theDayOfTheYear = 222; 
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setYear:theYear]; 
[components setDay:theDayOfTheYear]; 
NSDate* theDate = [gregorian dateFromComponents:components]; 

이 나에게 조금 너무 해키 보인다. NSDateComponents 클래스 참조에서이 문제에 대한 언급을 찾지 못한 31 일이 넘는 날에도 작동한다는 것은 우연한 일일 수 있습니다. > 가까운,하지만 2016-08-09해야


즉 일반 DD-MM-YYYY 날짜를 변환, 역 작업을 수행하려면 -

내가 디버깅, po theDate 나에게 2016-08-08 22:00:00 +0000 을 제공합니다 (!) day of the year에,이 코드를 사용하고 있습니다 ...

NSDate *fullDate = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSUInteger dayOfYear = [gregorian ordinalityOfUnit:NSDayCalendarUnit 
              inUnit:NSYearCalendarUnit 
              forDate:fullDate]; 

을하지만 반대 할 적절한 방법을 찾을 수 없습니다

+0

; 하루 구성 요소는 달력에 따라 해석됩니다 (정확하게 작동하는 방식이 불분명 함). 또한 출력 날짜를 디버깅하는 WRT; 'po'가 현지 시간대가 아닌 UTC로 날짜/시간을 인쇄 할 것이라고 생각 했습니까? – Droppy

답변

1

때로는 테스트가 모두 필요합니다.

NSDate는 GMT이므로 [[NSTimeZone localTimeZone] secondsFromGMT] 초를 추가 할 수 있습니다.

당신이 :)이

- (void) testDate 
{ 
    int startYear = 2016; 
    int startMonth = 1; 
    int startDay = 1; 

    // Create the startDate 
    NSDateComponents * startDateComp = [NSDateComponents new]; 
    startDateComp.day = startDay; 
    startDateComp.month = startMonth; 
    startDateComp.year = startYear; 
    NSDate * startDate = [[NSCalendar currentCalendar] dateFromComponents:startDateComp]; 


    for(int i=0 ; i < 365; i++) 
    { 
     // add i day to startDate 
     NSDate * testDate = [startDate dateByAddingTimeInterval:i * 24 * 60 * 60]; 

     NSUInteger dayOfYear = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit 
                     inUnit:NSYearCalendarUnit 
                     forDate:testDate]; 

     XCTAssert(dayOfYear == (i + 1), @"the day of the year should be i + 1"); 

     // Create a date using day of year 
     NSDateComponents *components = [[NSDateComponents alloc] init]; 
     [components setYear:startYear]; 
     [components setDay:dayOfYear]; 
     NSDate* resultDate = [[NSCalendar currentCalendar] dateFromComponents:components]; 

     // testing result date against test date 

     NSInteger test, result; 

     test = [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:testDate]; 
     result = [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:resultDate]; 
     XCTAssert(test == result); 

     test = [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:testDate]; 
     result = [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:resultDate]; 
     XCTAssert(test == result); 

     test = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:testDate]; 
     result = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:resultDate]; 
     XCTAssert(test == result); 

    } 
+0

감사합니다. Florian! Duh - 시간대를 잊어 버렸습니다 ... 거의 저기있었습니다. 디버거 출력이 저를 오도하고있는 것 같습니다 :-) setDay : dayOfYear가 디자인 상 우연히 작동하는지 여부는 아직 확실하지 않지만 테스트에는 적어도 덮여 있습니다 애플이 그것을 바꾼다면. – SideLobe

0

이 시도하십시오 작업이 보인다. 그것의 더 큰 달력 단위 NSCalendarUnitEra : 나는 전혀 작동이 놀란다

NSDate *fullDate = [NSDate date]; 
NSCalendar *gregorian = [NSCalendar currentCalendar]; 
gregorian.timeZone = [NSTimeZone systemTimeZone]; 
NSUInteger dayOfYear = [gregorian ordinalityOfUnit:NSCalendarUnitDay 
              inUnit:NSCalendarUnitEra 
              forDate:fullDate]; 

NSDateComponents *dateCom = [[NSDateComponents alloc] init]; 
dateCom.day = dayOfYear; 

NSDate *expectedDate = [gregorian dateFromComponents:dateCom]; 
NSLog(@"%@",expectedDate); 

enter image description here