2つの日付の差を計算するにはどうすればよいですか?


回答:


237
NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@"There are %d days in between the two dates.", numberOfDays);

編集:

覚えておいて、NSDateオブジェクトが時間の正確な瞬間を表し、彼らは任意の関連するタイムゾーン情報を持っていません。たとえばを使用して文字列を日付NSDateFormatterNSDateFormatter変換すると、は設定されたタイムゾーンから時刻を変換します。したがって、2つのNSDateオブジェクト間の秒数は常にタイムゾーンに依存しません。

さらに、このドキュメントでは、Cocoaの時間の実装ではうるう秒は考慮されていないため、そのような正確さが必要な場合は、独自の実装をロールする必要があります。


5
@RalucaGurau:86400は1日の秒数です(つまり、60秒、60分、24時間)。それは月とは何の関係もありません。
dreamlax

18
すべての日に86400秒があるわけではありません。ささいな例の場合は問題ありませんが、現実の世界では良い考えではありません。DSTの変更、うるう秒などはすべて混乱します。NSCalendarは、特定の日に何秒あるかを通知します。
NeilInglis

2
@muthukumar:ないiOSでは、この方法は、Mac OS X上で利用できるこの質問はタグ付けされているcocoaといないcocoa-touch、この答えはMac OS Xのみに適用されますので、
dreamlax

1
2つの瞬間の間の日数は常に86400です。人間が通常よりも1時間早く目を覚ますためにだまされている段階にあるかどうかに関係なく、1日が86400秒であるという事実は変わりません(跳躍を無視)秒)
dreamlax 2015

1
最後に+0000がない場合は、追加したいだけですが、何があっても、diffでは常にnullの日付と0の値が取得されます。だから、その罠に陥らないでください。
Volomike、2016年

84

あなたはこのようなものを使いたいかもしれません:

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];

この方法は、夏時間の変更にまたがる日付などの状況を考慮していると思います。


2
指定された日付の時間も無視する簡単な方法はありますか?
Mihai Timar 2013年

それに応じて、他のカレンダーユニットでも変更できます:)年のユニットに使用されます。
テクノロジーに精通した2014

NSDateオブジェクトはすでにタイムゾーンに依存していません。たとえばNSDateFormatterで日付を解析すると、タイムゾーン情報が削除され、NSDateオブジェクトが正確な瞬間を表します。したがって、すでにstartDateおよびがある場合endDate、これらの2つのオブジェクトはx秒の間隔があります。タイムゾーンはそれとは関係ありません。
dreamlax 2014年

@ベンジャミン:どうしてそんなことを言うの?
dreamlax 14

dreamlax、あなたの答えは間違っています。簡潔でシンプル。1月1日正午12時から標準時4月12日正午までの日数を計算すると、数式が機能しなくなります。これは遅延式であり、開発者はNSDateComponentsオブジェクトを使用してこれを計算する必要があります。
Rickster

25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

どこdate1date2しているNSDateの。

また、次の定義にも注意してくださいNSTimeInterval

typedef double NSTimeInterval;

NSTimeIntervalは実際にはdoubleであるため、他の数値と同じように使用できます。
Kendall Helmstetter Gelner、2010

19

これをチェックアウトしてください。iOSカレンダーを使用して計算するため、夏時間のうるう年を処理します。文字列と条件を変更して、時間と日を含む分を含めることができます。

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];

    days = [components day];
    hour = [components hour];
    minutes = [components minute];

    if(days>0)
    {
        if(days>1)
            durationString=[NSString stringWithFormat:@"%d days",days];
        else
            durationString=[NSString stringWithFormat:@"%d day",days];
        return durationString;
    }
    if(hour>0)
    {        
        if(hour>1)
            durationString=[NSString stringWithFormat:@"%d hours",hour];
        else
            durationString=[NSString stringWithFormat:@"%d hour",hour];
        return durationString;
    }
    if(minutes>0)
    {
        if(minutes>1)
            durationString = [NSString stringWithFormat:@"%d minutes",minutes];
        else
            durationString = [NSString stringWithFormat:@"%d minute",minutes];

        return durationString;
    }
    return @""; 
}

この方法は、時間差を計算するのに最適な方法です。
Moxarth 2017年

すべてのif条件でelseifを維持できます。そうしないと、表示される時刻の形式は1つだけになります。
Moxarth 2017年

3

Swift 5とiOS 12では、ニーズに応じて、次の2つの方法のいずれかを使用して、2つの日付の日数の違いを見つけることができます。


#1。CalendardateComponents(_:from:to:)方法を使用する

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)

print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)

#2。DateComponentsFormatterstring(from:to:)方法を使用する

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]

let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional("1,621 days")

1

Swift 4
試してみてください(文字列を含む日付範囲):

// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()


// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
    let stringDate = dateFormatter.string(from: startDate)
    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    dateRange.append(stringDate)
}

print("Resulting Array - \(dateRange)")

スウィフト3

var date1 = Date(string: "2010-01-01 00:00:00 +0000")
var date2 = Date(string: "2010-02-03 00:00:00 +0000")
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)

すべての日がその秒数を持っているわけではありません。
パヴァン

@Pavan-あなたはこの回答を更新してあなたの意見を共有し、それをより良くすることを歓迎します。
Krunal

それをより良くするために、私はあなたの回答全体を書き換える必要があります。その場合、ハードコードされた値を使用しない上記の回答と同じソリューションになるため、削除される可能性もあります:)
Pavan

0

日付を秒単位で変換して違いを見つけ、1970年以降の時間間隔をとって、2つの日付の違いを見つけることができます。


2つの日付を互いに直接計算できる場合(同じ時間領域を想定)。1970年以降の両方の日付を最初に計算してから差を見つける特定の理由はありますか?
Adeel 2017

0

違いを見つけるには、現在の日付と将来の日付を取得する必要があります。次の例では、将来の日付の例として2日を使用しました。計算:

2 days* 24 hours* 60 minutes* 60 seconds。2日の秒数は172,800になると予想されます。

// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0

1
回答としてコードだけを投稿するのではなく、コードが何をするか、それが質問の問題をどのように解決するかについての説明も提供してください。説明付きの回答は通常、質が高く、賛成票を集める可能性が高くなります。
Mark Rotteveel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.