25

これは、私が何時間も費やして理解したことに気付いたので、あなたと共有したいと思います.

問題は、特定の日付の年間通算日をどのように決定するかということでした。

たとえば、うるう年でない場合、1 月 15 日は 15 日目、12 月 31 日は 365 日目です。

4

6 に答える 6

75

これを試して:

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

ここdateで、年間通算日を決定する日付です。NSCalendar.ordinalityOfUnit メソッドのドキュメントはこちらです。

于 2010-01-17T12:28:55.830 に答える
9

したがって、私が思いついた解決策は非常にすっきりとシンプルで、決して複雑ではありません。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"D"];
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue];
[formatter release];
return dayOfYear;

ここで私が理解するのに非常に長い時間を費やした秘訣は、NSDateFormatter を使用することでした。「D」は年の日のフラグです。

私と同じように悩んでいる方の参考になれば幸いです。

于 2010-01-17T12:28:15.860 に答える
5

ARC を使用して非推奨のシンボルを置き換えると、John Feminella の答えは次のようになります。

NSCalendar *greg    = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];
于 2016-03-10T15:39:11.730 に答える
-2

NSDateクラスでメッセージを使用しますtimeIntervalSinceDate必要な日付からの経過秒数を表すNSTimeInterval値 (実際には double) が返されます。その後、秒を日に変換するのは簡単です。

切り捨てるseconds/86400と、日数がかかります。

2010 年 1 月 1 日からの日数が必要だとします。

// current date/time
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]];

// days since January 1st 2010 00:00:00 (GMT -4) until now
int days = (int)interval/86400;
于 2010-01-17T12:27:15.290 に答える