2012-01-03 7 views
0

次のコードは、yearweekが渡されたときの前週の週数を計算します。 目的C NSCalendar dateFromComponentsが週53を処理していない

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setYear:year]; 
[components setWeek:NSWeekCalendarUnit]; 
[components setWeekOfYear:(week-1)]; //Get the previous week 
[components setWeekday:2]; //Monday 
[components setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [calendar dateFromComponents:components]; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyyww"]; 
NSString *newRevision = [formatter stringFromDate:date]; 

は、私は、これは(201052を与える)201101のようなケースを扱ったことに驚きましたが、それは正しく53週ある年を処理しません。たとえば、201601の場合、201153の代わりに201552が返されます(少なくとも201135は http://en.wikipedia.org/wiki/ISO_week_dateに従って返されます)。

私は何か間違っていますか?私は、入力が正しいことを確認するために追跡しました。

答えて

1

を使用してみてください。質問の中のウィキペディアのリンクから、私たちは次の400年の間に53週間のすべての年のリストを得て、慎重にそれらをコード化した(賢明なコメントと「正しい」解決策を含む)。

if (week == 1) 
{ 
    year = year - 1; 
    week = 52; 
    if (year == 2004 || year == 2009 || year == 2015 || year == 2020 || year == 2026 || year == 2032 || year == 2037 || year == 2043 || year == 2048 || year == 2054 || year == 2060 || year == 2065 || year == 2071 || year == 2076 || year == 2082 || year == 2088 || year == 2093 || year == 2099 || year == 2105 || year == 2111 || year == 2116 || year == 2122 || year == 2128 || year == 2133 || year == 2139 || year == 2144 || year == 2150 || year == 2156 || year == 2161 || year == 2167 || year == 2172 || year == 2178 || year == 2184 || year == 2189 || year == 2195 || year == 2201 || year == 2207 || year == 2212 || year == 2218 || year == 2224 || year == 2229 || year == 2235 || year == 2240 || year == 2246 || year == 2252 || year == 2257 || year == 2263 || year == 2268 || year == 2274 || year == 2280 || year == 2285 || year == 2291 || year == 2296 || year == 2303 || year == 2308 || year == 2314 || year == 2320 || year == 2325 || year == 2331 || year == 2336 || year == 2342 || year == 2348 || year == 2353 || year == 2359 || year == 2364 || year == 2370 || year == 2376 || year == 2381 || year == 2387 || year == 2392 || year == 2398) 
    { 
     week = 53; 
    } 
} 
else 
{ 
    week = week-1; 
} 

それは理想的ではないのですが、Appleは2404

2

あなたのカレンダーにはNSGregorianCalendarが選択されています。私たちは、ハックのビットで問題に働くことになったNSISO8601Calendar

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSISO8601Calendar]; 
+0

の日付の年を与えます。掘り出した後、 'NSISO8601Calendar'はまだ実装されていません(http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html#//を参照)。 apple_ref/occ/cl/NSLocale)。 –

0

をISO 8601を実装または年までのいずれかになるまで、それはあなたが得る必要がある場合月1日2016のために仕事を行います。

  • 週代わりに= 53
  • 年=

2015あなたがあなたの答えの使用を印刷している "YYYY" 「yyyy」の

  • YYYY - yyyyの
  • 週間のあなたの年を与える - これは有望に見えたが、 `nil`を返すinitWithCalendarIdentifier`その変更を`行った後、あなたに
関連する問題