İki tarih arasındaki farkı nasıl hesaplayabilirim?


Yanıtlar:


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

DÜZENLE:

Unutmayın, NSDatenesneler zamanın kesin anlarını temsil eder, ilişkili herhangi bir zaman dilimi bilgisine sahip değildirler. Bir örneğin kullanarak bir tarihe bir dize dönüştürdüğünüzde NSDateFormatter, NSDateFormatterdönüştürür yapılandırılan saat dilimine itibaren geçen süre. Bu nedenle, iki NSDatenesne arasındaki saniye sayısı her zaman zaman zaman diliminden bağımsız olacaktır.

Ayrıca, bu dokümantasyon Cocoa'nın zaman uygulamasının artık saniyeleri hesaba katmadığını belirtir , bu nedenle böyle bir doğruluğa ihtiyaç duyarsanız, kendi uygulamanızı devreye almanız gerekecektir.


5
@RalucaGurau: 86400, bir gün içindeki saniye sayısıdır (yani 60 saniye, çarpı 60 dakika, çarpı 24 saat). Ayla ilgili hiçbir şey yok.
dreamlax

18
Her gün 86400 saniyeye sahip değildir. Önemsiz bir örnek için bu iyi ama gerçek dünyada bu iyi bir fikir değil. DST değişiklikleri, artık saniyeler vb. Tüm bunları karıştırabilir. NSCalendar, belirli bir günde kaç saniye olduğunu size söyleyebilir.
NeilInglis

2
@muthukumar: iOS'ta değil, yöntem yalnızca Mac OS X'te kullanılabilir. Bu soru etiketlenmiştir cocoave bu cocoa-touchnedenle bu yanıt yalnızca Mac OS X için geçerli değildir .
dreamlax

1
Zamanın herhangi iki anı arasındaki gün sayısı her zaman 86400 olacaktır. İnsanların kendilerini normalden bir saat önce uyanmak için kandırma aşamasında olup olmadıkları, bir günün 86400 saniye uzunluğunda olduğu gerçeğinde hiçbir fark yaratmaz (sıçramayı göz ardı ederek saniye)
dreamlax

1
Sonunda +0000 yoksa sıfır tarihler ve ne olursa olsun farkta her zaman 0 değeri alacağınızı eklemek istiyorum. Yani, o tuzağa düşmeyin.
Volomike

84

Bunun gibi bir şey kullanmak isteyebilirsiniz:

NSDateComponents *components;
NSInteger days;

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

Bu yöntemin gün ışığı tasarrufundaki bir değişikliği kapsayan tarihler gibi durumları hesaba kattığına inanıyorum.


2
verilen tarihler için saati de görmezden gelmenin basit bir yolu var mı?
Mihai Timar

diğer takvim birimleri için uygun şekilde değiştirilebilir :) Yıl birimi için kullanılır.
tech savvy

NSDatenesneler zaten zaman diliminden bağımsızdır. Tarihler örn. İle ayrıştırılırken saat dilimi bilgileri kaldırılır NSDateFormatter, böylece NSDatenesneler zamandaki tam anları temsil eder. Bu nedenle, zaten startDateve sahipseniz endDate, bu iki nesne x saniye aralıklı olacaktır. Zaman dilimlerinin bununla hiçbir ilgisi olmayacak.
dreamlax

@Benjamin: Bunu neden söylüyorsun?
dreamlax

dreamlax, cevabın yanlış. Sade ve basit. 1 Ocak standart saatiyle öğlen 12 ile 1 Nisan gündüz saatlerinde öğlen 12 arasındaki gün sayısını hesaplayın ve formülünüz çalışmıyor. Bu tembel bir formüldür ve geliştiriciler bunu hesaplamak için NSDateComponents nesnesini kullanmalıdır.
Rickster

25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

burada date1ve date2vardır NSDate's.

Ayrıca şunun tanımına da dikkat edin NSTimeInterval:

typedef double NSTimeInterval;

NSTimeInterval'in gerçekten bir double olduğuna dikkat edin, bu nedenle onu herhangi bir sayı gibi kullanabilirsiniz.
Kendall Helmstetter Gelner

19

Şuna bak. Hesaplamak için iOS takvimini kullandığı için gün ışığından yararlanma, artık yıl ile ilgilenir. Dizeyi ve koşulları, saat ve günlerle dakikaları içerecek şekilde değiştirebilirsiniz.

+(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 @""; 
}

bu yöntem, zaman farkını hesaplamanın mükemmel bir yoludur.
Moxarth

Sadece tüm bu şartlarla başka yerde kalabilirsiniz. aksi takdirde yalnızca tek bir zaman biçimi gösterilir.
Moxarth

3

Swift 5 ve iOS 12 ile ihtiyacınıza göre iki tarih arasındaki farkı gün olarak bulmak için aşağıdaki iki yoldan birini kullanabilirsiniz.


# 1. Kullanma Calendarbireyin dateComponents(_:from:to:)yöntemi

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. Kullanma DateComponentsFormatterbireyin string(from:to:)yöntemi

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

1

Swift 4
Bunu deneyin ve bakın (String ile tarih aralığı):

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

Hızlı 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)

Her gün bu kadar saniyeye sahip değildir.
Pavan

@Pavan - Bu cevabı güncelleyerek ve daha iyi hale getirerek girdilerinizi paylaşmaktan memnuniyet duyarız.
Krunal

Daha iyi hale getirmek için tüm cevabınızı yeniden yazmam gerekir, bu durumda cevap silinebilir çünkü kodlanmış değerleri kullanmayan yukarıdaki cevapla aynı çözüm olacaktır :)
Pavan

0

Tarihi saniye cinsinden çevirerek farkı bulabilir ve bunun için 1970'den beri zaman aralığı alabilir ve ardından iki tarih arasındaki farkı bulabilirsiniz.


iki tarih birbiriyle doğrudan hesaplanabildiğinde (aynı zaman alanı varsayılarak). 1970'den beri her iki tarihi de hesaplamanın ve sonra farkı bulmanın belirli bir nedeni var mı?
Adeel

0

Farkı bulmak için, gelecekteki güncel tarihi ve tarihi almanız gerekir. Aşağıdaki durumda, gelecek tarihin bir örneği için 2 gün kullandım. Hesaplayan:

2 days* 24 hours* 60 minutes* 60 seconds. 2 gündeki saniye sayısının 172.800 olmasını bekliyoruz.

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

1
Lütfen yanıt olarak yalnızca kod göndermeyin, aynı zamanda kodunuzun ne yaptığını ve sorunun sorununu nasıl çözdüğünü de açıklayın. Açıklamalı yanıtlar genellikle daha kalitelidir ve olumlu oylar alma olasılığı daha yüksektir.
Mark Rotteveel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.