web-dev-qa-db-ja.com

目標C-2つの日付間の日数を計算する

可能性のある複製:
2つの日付を比較し、日数を返す方法

2つの日付(「yyyy-mm-dd」の形式のNSStringとして)があります。例えば:

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

実装したい:

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

}

ありがとう!

56
CodeGuy
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]);
170
vikingosegundo

日付と時刻のプログラミングに関する完全なガイドがあります。ここに 関連セクション があり、これは何をすべきかのヒントを与えてくれます。

他の質問のコード例はここから来ています。

それに基づいて何かを書いてみて、特定の質問がある場合は戻ってきてください。

編集

はい。最も基本的な形式でコードを記述する方法を次に示します。

まず、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ビットのGarbage Collected環境で実行します):

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);

これは非常に残念です。コードと誤った出力を投稿し、より具体的なヘルプを取得することで、より多くのことを学んだからです。しかし、切り貼りのプログラマになりたい場合は、このコードと幸運をお祈りします。

23
Abizern

このコードはSwift 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
}
6
iphaaw

Swift 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!
  }

Objective 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;

}
5
Naishta

ObjCコード:

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

結果:

int totalDays = (int)dateComponent.day;
3
Gobi M

スウィフト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!
3
Blixt