web-dev-qa-db-ja.com

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

2010年1月1日から(たとえば)2010年2月3日までの日数を計算するにはどうすればよいですか?

108
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オブジェクト間の秒数は、alwaysタイムゾーンに依存しません。

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

228
dreamlax

次のようなものを使用できます。

NSDateComponents *components;
NSInteger days;

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

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

82
Casey Fleser
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

ここで、date1date2NSDateのものです。

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

typedef double NSTimeInterval;
24
Chetan

これをチェックしてください。 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 @""; 
}
19
Ankish Jain

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


#1。 Calendarの-​​ dateComponents(_: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。 DateComponentsFormatterの-​​ string(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")
2
Imanou Petit

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

Swift

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)
1
Krunal

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

0
Himanshu Bhatia