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

objective-c swift xcode date nsdate

101009 просмотра

7 ответа

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

Автор: Frederik Heyninck Источник Размещён: 17.05.2019 03:16

Ответы (7)


223 плюса

Решение
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);

РЕДАКТИРОВАТЬ:

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

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

Автор: dreamlax Размещён: 06.12.2010 11:58

78 плюса

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

NSDateComponents *components;
NSInteger days;

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

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

Автор: Casey Fleser Размещён: 07.12.2010 03:15

23 плюса

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

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

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

typedef double NSTimeInterval;
Автор: Chetan Размещён: 06.12.2010 11:00

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 @""; 
}
Автор: Ankish Jain Размещён: 18.09.2015 09:43

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)
Автор: Krunal Размещён: 15.05.2017 11:13

0 плюса

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

Автор: Himanshu Bhatia Размещён: 25.04.2016 05:08

0 плюса

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


# 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")
Автор: Imanou Petit Размещён: 01.02.2019 12:32
Вопросы из категории :
32x32