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

95

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

Теги:
xcode
date
cocoa
nsdate

7 ответов

212
Лучший ответ
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 время выполнения не учитывает секунды прыжка, поэтому, если вам нужна такая точность, вы будете необходимо выполнить собственную реализацию.

  • 0
    почему это 86400? Если в феврале 28 дней ... или другой месяц, он должен быть другим. Дополнительный метод должен быть добавлен
  • 5
    @RalucaGurau: 86400 - это количество секунд в дне (то есть 60 секунд, 60 минут, 24 часа). Это не имеет ничего общего с месяцем.
Показать ещё 17 комментариев
81

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

NSDateComponents *components;
NSInteger days;

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

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

  • 2
    Есть ли простой способ игнорировать время для указанных дат?
  • 0
    может быть соответственно изменен для других календарных единиц :), используемых для единиц измерения года.
Показать ещё 4 комментария
24
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

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

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

typedef double NSTimeInterval;
  • 0
    Обратите внимание, что NSTimeInterval действительно двойной, поэтому вы можете использовать его как любое другое число.
18

Ознакомьтесь с этим. Он заботится о летнем свете, високосный год, поскольку он использовал календарь 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 @""; 
}
  • 0
    Работает как шарм !!! Upvoted ..
  • 0
    Этот метод является идеальным способом расчета разницы во времени.
Показать ещё 1 комментарий
1

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)
  • 0
    Не все дни имеют такое количество секунд.
  • 0
    @Pavan - вы можете поделиться своим мнением, обновив этот ответ и сделав его лучше.
Показать ещё 1 комментарий
0

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

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

  • 0
    когда две даты могут быть рассчитаны друг с другом напрямую (при условии, что одна и та же временная область). Есть ли какая-то конкретная причина для расчета обеих дат с 1970 года, а затем для нахождения разницы?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню