Вопрос:

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

objective-c swift xcode date nsdate

101009 просмотра

7 ответа

1446 Репутация автора

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

Автор: Frederik Heyninck Источник Размещён: 06.12.2010 10:52

Ответы (7)


23 плюса

22002 Репутация автора

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

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

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

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

223 плюса

78494 Репутация автора

Решение
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 плюса

4977 Репутация автора

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

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

18 плюса

8684 Репутация автора

Оформить заказ Он учитывает переход на летнее время, високосный год, поскольку он использует календарь 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

0 плюса

31 Репутация автора

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

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

1 плюс

38974 Репутация автора

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 плюса

46975 Репутация автора

С 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