Как я могу рассчитать разницу между двумя датами?

Как я могу рассчитать дни между 1 января 2010 года и (например) 3 февраля 2010 года?

Ответ 1

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:

Помните, что объекты NSDate представляют собой точные моменты времени, они не имеют связанной информации о часовом поясе. Когда вы конвертируете строку в дату, например, a NSDateFormatter, NSDateFormatter преобразует время из настроенного часового пояса. Следовательно, количество секунд между двумя объектами NSDate всегда будет агностическим по времени.

Кроме того, эта документация указывает, что Cocoa время выполнения не учитывает секунды прыжка, поэтому, если вам нужна такая точность, вы будете необходимо выполнить собственную реализацию.

Ответ 2

Вы можете использовать что-то вроде этого:

NSDateComponents *components;
NSInteger days;

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

Я считаю, что этот метод учитывает такие ситуации, как даты, которые изменяют переход на летнее время.

Ответ 3

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

где date1 и date2 являются NSDate.

Также обратите внимание на определение NSTimeInterval:

typedef double NSTimeInterval;

Ответ 4

Ознакомьтесь с этим. Он заботится о летнем свете, високосный год, поскольку он использовал календарь 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 @""; 
}

Ответ 5

Swift 4
Попробуйте это и посмотрите (диапазон дат со строкой):

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

Свифт 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)

Ответ 6

Вы можете найти разницу, изменив дату в секундах и займите временной интервал с 1970 года для этого, а затем вы можете найти разницу между двумя датами.

Ответ 7

В Swift 5 и iOS 12, в зависимости от ваших потребностей, вы можете использовать один из двух следующих способов, чтобы найти разницу между двумя датами в днях.


# 1. Использование Calendar dateComponents(_:from:to:) метод

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. Использование string(from:to:) DateComponentsFormatter string(from:to:) метод

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