2016-08-10 19 views
0

日付が整数プロパティに保存される従来のデータオブジェクトのGUIを書いていますday of the yearyear(実際の "天才"デザイン...)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]; 

は、これは私には少しもハックようです。 > 31日で動作することはちょうど偶然かもしれません - NSDateComponentsクラスリファレンスでこれについて何も言及していません。通常のDD-MM-YYYYの日付を変換するために、すなわち、>近いが、それは逆の操作を実行するには2016-08-09


する必要があります -

私がデバッグ、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

ありがとうフロリアン! 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

関連する問題