Cara menghitung waktu dalam jam antara dua tanggal di iOS

103

Bagaimana cara menghitung waktu yang telah berlalu dalam beberapa jam antara dua waktu (mungkin terjadi pada hari yang berbeda) di iOS?

iosrookie
sumber
1
Pilihan lain adalah dengan menggunakan NSCalendar's -components:fromDate:toDate:options:metode.
Thomas Müller
Saya tidak percaya ini akan memberi Anda jumlah jam yang pasti. Ini hanya akan memberi Anda nilai dari 0-24, di mana Anda harus mengandalkan komponen Hari, Bulan, dan Tahun untuk mendapatkan interval waktu penuh.
codeperson
Saya menguji ini, dan itu berfungsi dengan baik. Dengan fromDate 1 / Jan / 2012 dan toDate 4 / Jan / 2012 ini mengembalikan 96 jam.
Thomas Müller
memposting kode Anda Thomas? Itu tidak berhasil untuk beberapa orang.
John Riselvato

Jawaban:

171

The NSDate fungsi timeIntervalSinceDate: akan memberikan perbedaan dari dua tanggal dalam hitungan detik.

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

Lihat, perpustakaan referensi apel http://developer.apple.com/library/mac/navigation/ atau jika Anda menggunakan Xcode pilih saja bantuan / dokumentasi dari menu.

Lihat: cara-mengubah-an-nstimeinterval-detik-ke-menit

--edit: Lihat jawaban ÐąrέÐέvil di bawah untuk menangani dengan benar pergeseran waktu siang hari / detik kabisat

Akusete
sumber
2
Dan apa yang terjadi jika tanggal / waktu melewati transisi untuk Daylight Savings?
Abizern
2
@Abizern: Terima kasih, saya tidak mempertimbangkan kasus-kasus itu ketika saya menjawab pertanyaan itu. Saya telah menautkan ke jawaban oleh ÐąrέÐέvil
Akusete
saya punya slot waktu seperti 4:50:30, h: m: si harus mengurangi waktu ini dari 12:30:20 bagaimana saya akan melakukan ini
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

Ubah komponen yang diperlukan menjadi hari, jam atau menit, perbedaan yang Anda inginkan. Jika NSDayCalendarUnitdipilih maka itu akan mengembalikan jumlah hari antara dua tanggal serupa untuk NSHourCalendarUnitdanNSMinuteCalendarUnit

Versi 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!
aahsanali
sumber
Berapa nilai yang diterima dateWithTimeIntervalSince1970? saya yakin Anda telah mengubah tanggal 2012-06-22 menjadi 1340323201. tolong koreksi saya.
Jeet
Tidak bekerja untuk saya. Mendapat nilai berbeda sebagai 9223372036854775807. Apakah dalam milidetik?
Kirti Nikam
Swift 4.2.0 Alih-alih [.hour] Anda dapat menggunakan 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;
}
Ashish Patel
sumber
9
Tidak, jangan lakukan ini. Tidak semua jam memiliki 3600 detik. Tidak semua hari memiliki 24 jam.
rmaddy
5
Ini sangat salah. Tidak memperhitungkan detik kabisat, penghematan waktu siang hari. Harap jangan menemukan kembali roda cukup gunakan API yang disediakan dengan iOS seperti NSDateComponents.
Juan Catalan
5

Pembayaran: Ini menangani penghematan siang hari, tahun kabisat karena menggunakan kalender iOS untuk menghitung. Anda dapat mengubah string dan ketentuan untuk menyertakan menit dengan jam dan hari.

+(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 @"";
}
Ankish Jain
sumber
itu tidak menunjukkan perbedaan lebih dari 12 jam. jika saya ingin memeriksa beberapa kondisi pada 23 jam, lalu bagaimana cara mendapatkan perbedaan antara waktu 23 jam?
Moxarth
Ini memberikan interval waktu yang salah, tidak bekerja untuk saya.
Arvind Patel
3

Bagi yang menggunakan swift 3 ke atas,

    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
john raja
sumber