Как я могу рассчитать разницу между двумя датами? - PullRequest
106 голосов
/ 07 декабря 2010

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

Ответы [ 7 ]

226 голосов
/ 07 декабря 2010
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 объекты представляют точные моменты времени, они не имеют никакой связанной информации о часовом поясе. Когда вы конвертируете строку в дату, используя, например, NSDateFormatter, NSDateFormatter преобразует время из настроенного часового пояса. Следовательно, количество секунд между двумя NSDate объектами будет всегда быть независимым от часового пояса.

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

80 голосов
/ 07 декабря 2010

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

NSDateComponents *components;
NSInteger days;

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

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

23 голосов
/ 07 декабря 2010
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

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

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

typedef double NSTimeInterval;
19 голосов
/ 18 сентября 2015

Оформить заказ.Он учитывает переход на летнее время, високосный год, поскольку он использует календарь iOS для расчета. Вы можете изменить строку и условия, включив минуты с часами и днями.

1 голос
/ 01 февраля 2019

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


# 1.Используя Calendar s 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.Используя DateComponentsFormatter s 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")
1 голос
/ 15 мая 2017

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

Swift 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 голосов
/ 25 апреля 2016

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

...