วิธีคำนวณเวลาเป็นชั่วโมงระหว่างวันที่สองวันใน iOS


103

ฉันจะคำนวณเวลาที่ผ่านไปเป็นชั่วโมงระหว่างสองครั้ง (อาจเกิดขึ้นในวันที่ต่างกัน) ใน iOS ได้อย่างไร


1
อีกตัวเลือกหนึ่งคือการใช้งานNSCalendarของ-components:fromDate:toDate:options:วิธีการ
Thomas Müller

ฉันไม่เชื่อว่าสิ่งนี้จะทำให้คุณมีเวลาเหลือเฟือ จะให้ค่าตั้งแต่ 0-24 เท่านั้นโดยที่คุณต้องพึ่งพาส่วนประกอบวันเดือนและปีเพื่อให้ได้ช่วงเวลาเต็ม
codeperson

ฉันทดสอบสิ่งนี้แล้วและใช้งานได้ดี ตั้งแต่วันที่ 1 / ม.ค. / 2555 และถึงวันที่ 4 / ม.ค. / 2555 สิ่งนี้ส่งคืน 96 ชั่วโมง
Thomas Müller

โพสต์รหัสของคุณโทมัส? มันไม่ได้ผลสำหรับบางคน
John Riselvato

คำตอบ:


171

NSDateฟังก์ชั่นtimeIntervalSinceDate:จะให้ความแตกต่างของทั้งสองวันในไม่กี่วินาที

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

ดูไลบรารีอ้างอิงของ apple http://developer.apple.com/library/mac/navigation/ หรือหากคุณใช้ Xcode เพียงแค่เลือกhelp / documentationจากเมนู

ดู: วิธีการแปลง -nstimeinterval-seconds-to-minutes

- แก้ไข: ดูคำตอบของÐąrέÐέvilด้านล่างเพื่อจัดการกับการออมแสง / วินาทีอธิกสุรทินอย่างถูกต้อง


2
และจะเกิดอะไรขึ้นถ้าวันที่ / เวลาข้ามการเปลี่ยนแปลงสำหรับ Daylight Savings?
Abizern

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ถูกเลือกระบบจะส่งคืนจำนวนวันระหว่างวันที่สองวันในทำนองเดียวกันสำหรับ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

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
นี่เป็นความผิดโดยสิ้นเชิง ไม่คำนึงถึงวินาทีอธิกสุรทินการประหยัดเวลากลางวัน โปรดอย่าสร้างวงล้อใหม่เพียงแค่ใช้ API ที่มาพร้อมกับ iOS เช่น NSDateComponents
Juan Catalan

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

มันให้ช่วงเวลาที่ไม่ถูกต้องไม่ได้ผลสำหรับฉัน
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.