Bagaimana cara menghitung perbedaan antara dua tanggal?

115

Bagaimana cara menghitung hari antara 1 Jan 2010 dan (misalnya) 3 Feb 2010?

Frederik Heyninck
sumber

Jawaban:

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

EDIT:

Ingat, NSDateobjek mewakili momen waktu yang tepat, objek tidak memiliki informasi zona waktu terkait. Saat Anda mengonversi string menjadi tanggal menggunakan mis. An NSDateFormatter, waktu akan NSDateFormatterdiubah dari zona waktu yang dikonfigurasi. Oleh karena itu, jumlah detik antara dua NSDateobjek akan selalu zona waktu.

Lebih lanjut, dokumentasi ini menetapkan bahwa penerapan waktu Cocoa tidak memperhitungkan detik kabisat, jadi jika Anda memerlukan akurasi seperti itu, Anda perlu menggulirkan penerapan Anda sendiri.

dreamlax
sumber
5
@RalucaGurau: 86400 adalah jumlah detik dalam sehari (yaitu 60 detik, kali 60 menit, kali 24 jam). Tidak ada hubungannya dengan bulan.
dreamlax
18
Tidak semua hari memiliki 86400 detik. Untuk contoh sepele tidak apa-apa tapi itu bukan ide yang bagus di dunia nyata. Perubahan DST, detik kabisat, dll semuanya dapat mengacaukannya. NSCalendar dapat memberi tahu Anda berapa detik dalam satu hari.
NeilInglis
2
@muthukumar: Tidak di iOS, metode ini hanya tersedia di Mac OS X. Pertanyaan ini diberi tag cocoadan bukan cocoa-touchberarti jawaban ini hanya berlaku untuk Mac OS X.
dreamlax
1
Jumlah hari antara dua momen dalam waktu akan selalu 86400. Apakah manusia berada dalam tahap membodohi diri sendiri untuk bangun satu jam lebih awal dari biasanya atau tidak, tidak ada bedanya dengan fakta bahwa sehari panjangnya 86400 detik (mengabaikan lompatan detik)
dreamlax
1
Hanya ingin menambahkan bahwa jika Anda tidak memiliki +0000 pada akhirnya, Anda akan mendapatkan tanggal nol dan nilai 0 selalu pada perbedaan, apa pun yang terjadi. Jadi, jangan jatuh ke dalam jebakan itu.
Volomike
84

Anda mungkin ingin menggunakan sesuatu seperti ini:

NSDateComponents *components;
NSInteger days;

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

Saya percaya metode ini memperhitungkan situasi seperti tanggal yang mencakup perubahan dalam penghematan siang hari.

Casey Fleser
sumber
2
adakah cara sederhana untuk juga mengabaikan waktu untuk tanggal tertentu?
Mihai Timar
dapat diubah sesuai untuk unit kalender lainnya :) digunakan untuk unit Tahun.
ahli teknologi
NSDateobjek sudah agnostik zona waktu. Informasi zona waktu dihapus saat mengurai tanggal dengan misalnya NSDateFormatter, sehingga NSDateobjek mewakili momen tepat dalam waktu. Oleh karena itu, jika Anda sudah memiliki startDatedan endDate, kedua objek ini akan berjarak x jumlah detik. Zona waktu tidak ada hubungannya dengan itu.
dreamlax
@Benjamin: Mengapa Anda mengatakan itu?
dreamlax
dreamlax, jawaban Anda salah. Polos dan sederhana. Hitung jumlah hari antara 12 siang waktu standar 1 Januari dan 12 siang waktu siang 1 April, dan rumus Anda tidak berfungsi. Ini adalah rumus malas dan pengembang harus menggunakan objek NSDateComponents untuk menghitungnya.
Rickster
25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

dimana date1dan date2berada NSDate.

Perhatikan juga definisi dari NSTimeInterval:

typedef double NSTimeInterval;
Chetan
sumber
Perhatikan bahwa NSTimeInterval benar-benar ganda, jadi Anda dapat menggunakannya seperti nomor lain.
Kendall Helmstetter Gelner
19

Lihat ini. Ini menangani penghematan siang hari, tahun kabisat seperti yang digunakan 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
metode ini adalah cara sempurna untuk menghitung perbedaan waktu.
Moxarth
hanya Anda dapat menyimpan elseif dengan semua kondisi if itu. jika tidak, Anda hanya akan mendapatkan satu format waktu yang ditampilkan.
Moxarth
3

Dengan Swift 5 dan iOS 12, sesuai kebutuhan Anda, Anda dapat menggunakan salah satu dari dua cara berikut untuk menemukan perbedaan antara dua tanggal dalam hari.


# 1. Menggunakan Calendar's dateComponents(_:from:to:)metode

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. Menggunakan DateComponentsFormatter's string(from:to:)metode

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")
Imanou Petit
sumber
1

Swift 4
Coba ini dan lihat (rentang tanggal dengan String):

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

Cepat 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)
Krunal
sumber
Tidak semua hari memiliki jumlah detik sebanyak itu.
Pavan
@Pavan - Anda dipersilakan untuk membagikan masukan Anda dengan memperbarui jawaban ini dan menjadikannya lebih baik.
Krunal
Untuk membuatnya lebih baik saya harus menulis ulang seluruh jawaban Anda, dalam hal ini mungkin juga dihapus karena itu akan menjadi solusi yang sama dengan jawaban di atas yang tidak menggunakan nilai hardcode :)
Pavan
0

Anda dapat menemukan perbedaannya dengan mengubah tanggal dalam detik dan mengambil interval waktu sejak 1970 untuk ini dan kemudian Anda dapat menemukan perbedaan antara dua tanggal.

Himanshu Bhatia
sumber
ketika dua tanggal dapat dihitung satu sama lain secara langsung (dengan asumsi domain waktu yang sama). Adakah alasan khusus untuk menghitung kedua tanggal sejak tahun 1970 terlebih dahulu dan kemudian menemukan perbedaannya?
Adeel
0

Untuk menemukan perbedaannya, Anda perlu mendapatkan tanggal sekarang dan tanggal di masa depan. Dalam kasus berikut, saya menggunakan 2 hari untuk contoh tanggal yang akan datang. Dihitung oleh:

2 days* 24 hours* 60 minutes* 60 seconds. Kami perkirakan jumlah detik dalam 2 hari menjadi 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
Roi Zakai
sumber
1
Harap jangan hanya memposting kode sebagai jawaban, tetapi berikan juga penjelasan tentang fungsi kode Anda dan bagaimana kode tersebut menyelesaikan masalah pertanyaan. Jawaban dengan penjelasan biasanya berkualitas lebih tinggi, dan lebih cenderung menarik suara positif.
Mark Rotteveel