0

次のように NSDate にカテゴリを追加します。

@interface NSDate (ElapsedDays)

-(unsigned long) elapsedDays: (NSDate *) theDate;

@end

@implementation NSDate (ElapsedDays)

-(unsigned long) elapsedDays:(NSDate *)theDate
{
  self.[???]
}

@end

主に、NSDate を次のように宣言します。

NSDate *today=[NSDate date];

elapsedDays実装では、初期化された日付にどのようにアクセスできますかNSDate?

4

1 に答える 1

2

メッセージの受信者はelapsedDaysメソッドself実装スコープ内にあります。

例えば:

#import <Foundation/Foundation.h>

@interface NSDate (ElapsedDays)

- (NSInteger)elapsedDaysSinceDate:(NSDate *)theDate;
@end

@implementation NSDate (ElapsedDays)

static const NSInteger SecondsPerDay = 86400;

- (NSInteger)elapsedDaysSinceDate:(NSDate *)theDate {
    NSTimeInterval interval = [self timeIntervalSinceDate:theDate];
    return interval/SecondsPerDay;
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"MMddyyyy"];

        NSDate *date1 = [dateFormatter dateFromString:@"01012012"];
        NSDate *date2 = [dateFormatter dateFromString:@"12312012"];

        printf("Date difference = %ld",[date2 elapsedDaysSinceDate:date1]);
    }
}

コンソールDate difference = 365に出力します。

編集 (グレゴリオ暦の計算を使用)

#import <Foundation/Foundation.h>

@interface NSDate (ElapsedDays)

- (NSInteger)elapsedDaysSinceDate:(NSDate *)theDate;
@end

@implementation NSDate (ElapsedDays)

- (NSInteger)elapsedDaysSinceDate:(NSDate *)theDate {
    NSTimeInterval interval = [self timeIntervalSinceDate:theDate];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [gregorian components:NSDayCalendarUnit
                                        fromDate:theDate
                                          toDate:self 
                                                 options:0];
    return [components day];
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"MMddyyyy"];

        NSDate *date1 = [dateFormatter dateFromString:@"01012012"];
        NSDate *date2 = [dateFormatter dateFromString:@"12312012"];

        printf("Date difference = %ld",[date2 elapsedDaysSinceDate:date1]);
    }
}
于 2013-01-01T08:38:42.360 に答える