iOSで2つの日付間の時間を時間単位で計算する方法


103

iOSで2つの時間(異なる日に発生する可能性があります)間の経過時間を時間で計算するにはどうすればよいですか?


1
別のオプションは、NSCalendar-components:fromDate:toDate:options:メソッドを使用することです。
トーマス・ミュラー

これが絶対的な時間数になるとは思いません。完全な時間間隔を取得するには、日、月、年のコンポーネントに依存する必要がある0〜24の値のみが返されます。
コードパーソン、2012年

私はこれをテストしました、そしてそれはうまく働きます。fromDate 1 / Jan / 2012とtoDate 4 / Jan / 2012では、これは96時間を返しました。
トーマス・ミュラー

コードThomasを投稿しますか?一部では機能しません。
John Riselvato、2012年

回答:


171

NSDateの機能timeIntervalSinceDateは:あなた秒2つの日付の差が得られます。

 NSDate* date1 = someDate;
 NSDate* date2 = someOtherDate;
 NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
 double secondsInAnHour = 3600;
 NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;

アップルリファレンスライブラリ http://developer.apple.com/library/mac/navigation/を参照してください 。Xcodeを使用している場合は、メニューからhelp / documentationを選択しください。

参照:how-to-convert-an-nstimeinterval-seconds-into-minutes

--edit:夏時間/うるう秒の正しい処理については、以下のÐąranswervilの回答を参照してください


2
そして、日付/時間が夏時間の移行と交差するとどうなりますか?
Abizern 2013

2
@Abizern:ありがとう、私が質問に答えたとき、私はそれらのケースを考慮していませんでした。ÐąrέÐέvilによる回答にリンクしました
Akusete

4:50:30のようなタイムスロットがあります。h:m:siは、12:30:20からこの時間を減算する必要があります。これを行う方法
AyAz

90
NSCalendar *c = [NSCalendar currentCalendar];
NSDate *d1 = [NSDate date];
NSDate *d2 = [NSDate dateWithTimeIntervalSince1970:1340323201];//2012-06-22
NSDateComponents *components = [c components:NSHourCalendarUnit fromDate:d2 toDate:d1 options:0];
NSInteger diff = components.minute;

NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit

必要なコンポーネントを日、時間、または分に変更します。場合はNSDayCalendarUnit、選択され、それはのためにも同様に2つの日付の間の日数を返しますNSHourCalendarUnitし、NSMinuteCalendarUnit

Swift 4バージョン

let cal = Calendar.current
let d1 = Date()
let d2 = Date.init(timeIntervalSince1970: 1524787200) // April 27, 2018 12:00:00 AM
let components = cal.dateComponents([.hour], from: d2, to: d1)
let diff = components.hour!

dateWithTimeIntervalSince1970はどの値を受け入れますか?2012-06-22の日付を1340323201に変換したと思います。修正してください。
Jeet

私のために働いていません。差分値を9223372036854775807として取得しました。ミリ秒単位ですか?
Kirti Nikam 2017

Swift 4.2。[.hour]の代わりにSet <Calendar.Component>([。hour])を使用できます
IvanPavliuk

19
-(NSMutableString*) timeLeftSinceDate: (NSDate *) dateT {

    NSMutableString *timeLeft = [[NSMutableString alloc]init];

    NSDate *today10am =[NSDate date];

    NSInteger seconds = [today10am timeIntervalSinceDate:dateT];

    NSInteger days = (int) (floor(seconds / (3600 * 24)));
    if(days) seconds -= days * 3600 * 24;

    NSInteger hours = (int) (floor(seconds / 3600));
    if(hours) seconds -= hours * 3600;

    NSInteger minutes = (int) (floor(seconds / 60));
    if(minutes) seconds -= minutes * 60;

    if(days) {
        [timeLeft appendString:[NSString stringWithFormat:@"%ld Days", (long)days*-1]];
    }

    if(hours) {
        [timeLeft appendString:[NSString stringWithFormat: @"%ld H", (long)hours*-1]];
    }

    if(minutes) {
        [timeLeft appendString: [NSString stringWithFormat: @"%ld M",(long)minutes*-1]];
    }

    if(seconds) {
        [timeLeft appendString:[NSString stringWithFormat: @"%lds", (long)seconds*-1]];
    }

    return timeLeft;
}

9
いいえ、これを行わないでください。すべての時間に3600秒があるわけではありません。すべての日に24時間があるわけではありません。
rmaddy

5
これは完全に間違っています。うるう秒、夏時間の節約は考慮されません。NSDateComponentsのようなiOSで提供されるAPIを使用するだけで、ホイールを再発明しないでください。
ファンカタロニア語

5

チェックアウト: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 @"";
}

12時間以上の差はありません。23時間でいくつかの条件をチェックしたい場合、時間間の23時間の差をどのように取得するのですか?
Moxarth 2017

それは間違った時間間隔を与え、私のために働いていません。
Arvind Patel

3

Swift 3以上をお使いの方は、

    let dateString1 = "2018-03-15T14:20:00.000Z"
    let dateString2 = "2018-03-20T14:20:00.000Z"

    let Dateformatter = DateFormatter()
    Dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

    let date1 = Dateformatter.date(from: dateString1)
    let date2 = Dateformatter.date(from: dateString2)

    let distanceBetweenDates: TimeInterval? = date2?.timeIntervalSince(date1!)
    let secondsInAnHour: Double = 3600
    let secondsInDays: Double = 86400
    let secondsInWeek: Double = 604800

    let hoursBetweenDates = Int((distanceBetweenDates! / secondsInAnHour))
    let daysBetweenDates = Int((distanceBetweenDates! / secondsInDays))
    let weekBetweenDates = Int((distanceBetweenDates! / secondsInWeek))

    print(weekBetweenDates,"weeks")//0 weeks
    print(daysBetweenDates,"days")//5 days
    print(hoursBetweenDates,"hours")//120 hours
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.