2011-01-01 12 views
48
間の日数を計算

可能性の重複:
How can I compare two dates, return a number of days.オブジェクティブC - 二つの日付

Iは、2つの日付を持っている(形態でNSStringのように "YYYY-MM-DD")例えば:

NSString *start = "2010-11-01"; 
NSString *end = "2010-12-01"; 

私は実装したいと思います:

- (int)numberOfDaysBetween:(NSString *)startDate and:(NSString *)endDate { 

} 

ありがとう!

+3

複製? http://stackoverflow.com/questions/2548008/how-can-i-compare-two-dates-return-a-number-of-days – Mantar

+0

その質問は私が必要なものに答えることはありません。私は単にそのメソッドを実装する方法を見たいだけです。 – CodeGuy

+1

[私が言及した質問]の複製(http://stackoverflow.com/questions/2548008/how-can-i-compare-two-dates-return-a-number-of-days)では、その答えとまったく同じコードですが、月フラグを省略してください。 – Pascal

答えて

160
NSString *start = @"2010-09-01"; 
NSString *end = @"2010-12-01"; 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 

componentsは現在相違しています。

NSLog(@"%ld", [components day]); 
+0

コンポーネントからどのくらい正確にアクセスしますか? – Mahouk

+3

私の編集を参照してください。投票することを忘れないでください。 – vikingosegundo

+0

静的ではありませんか? –

21

日付と時刻のプログラミングには完全なガイドがあります。ここにはrelevant sectionがあります。これはあなたに何をすべきかのヒントを与えます。

これは、他の質問の例コードです。

具体的な質問がある場合は、それに基づいて何か試してみてください。

編集

わかりました。ここで私はそれを最も基本的な形式でコードを書く方法です。

まず、NSDateを拡張します。

ヘッダファイル:

// NSDate+ADNExtensions.h 

#import <Cocoa/Cocoa.h> 


@interface NSDate (ADNExtensions) 

- (NSInteger)numberOfDaysUntil:(NSDate *)aDate; 

@end 

実装ファイル:

// NSDate+ADNExtensions.m 

#import "NSDate+ADNExtensions.h" 


@implementation NSDate (ADNExtensions) 


- (NSInteger)numberOfDaysUntil:(NSDate *)aDate { 
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit fromDate:self toDate:aDate options:0]; 

    return [components day]; 
} 


@end 

これは非常に粗いコードです。 2番目の日付が最初の日付より後であることを確認または検証するエラーはありません。

そして私は(64ビット、ガベージコレクション環境で実行されている)、このようにそれを使用します。

NSDate *startDate = [NSDate dateWithString:@"2010-11-01 00:00:00 +0000"]; 
NSDate *endDate = [NSDate dateWithString:@"2010-11-02 00:00:00 +0000"]; 

NSInteger difference = [startDate numberOfDaysUntil:endDate]; 

NSLog(@"Diff = %ld", difference); 

あなたのコードを投稿することで、より多くのことを学んだだろうので、これは、そのような恥であります間違った出力とより具体的なヘルプを得ることができます。しかし、カット&ペーストのプログラマーになりたいならば。このコードとあなたに幸運を取る。

+0

コードを入力してください。正直言って、私は多くのことを試しました。私はグレゴリアンを使ってみましたが、NSTimeIntervalを取得しようとしました。メソッドを実装するだけですか? – CodeGuy

+12

ロバート、これは "私にコードを渡す"ウェブサイトではありません。あなたが固執していることについて質問し、その問題を解決するために*ヘルプ*を受け取ります。人々はあなたのためにあなたの問題を解決するだけではありません。あなたがこれを理解するとすぐに、スタックオーバーフローの人々からより良い回答を早く得ることができます。私はAbizerがあなたにコードを与えるのにちょっとしたものだと思う。 ;) – Jasarien

+0

btw、私は 'NSDate'メソッド' dateWithString'が全く存在していないと確信していますが、少なくとも古いものは廃止されていますので、2番目の答えはより関連していますので、 'NSDateFormatter'を使用する必要があります。 – Artem

6

このコードは、スウィフト2でうまく動作するようです:

func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int 
{ 
    let calendar = NSCalendar.currentCalendar() 

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: []) 

    return components.day 
} 
3

にObjCコード:

NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0]; 

結果:

int totalDays = (int)dateComponent.day; 
3

スウィフト3:

let formatter = DateFormatter() 
formatter.dateFormat = "yyyy-MM-dd" 
let start = formatter.date(from: "2010-09-01")! 
let end = formatter.date(from: "2010-12-01")! 
let days = Calendar.current.dateComponents([.day], from: start, to: end).day! 
+0

良い!それは助ける – Naishta

1

スイフト4実装

メソッド呼び出し:

let numberOfDays = daysBetweenDates(startDate: fileCreatedDate,endDate: date) 

メソッドの実装:

func daysBetweenDates(startDate: Date, endDate: Date) -> Int { 
     let daysBetween = Calendar.current.dateComponents([.day], from: startDate, to: endDate) 
     print(daysBetween.day!) 
     return daysBetween.day! 
    } 

オブジェクティブCの実装:

メソッドコール:

int numberOfDaysSinceFileCreation = [self daysBetweenDates: fileCreatedDate 
                    currentDate: today]; 

メソッドの実装:

- (int) daysBetweenDates: (NSDate *)startDate currentDate: (NSDate *)endDate 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *dateComponent = [calendar components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0]; 

    int totalDays = (int)dateComponent.day; 
    return totalDays; 

} 
関連する問題