두 날짜의 차이를 어떻게 계산할 수 있습니까?


답변:


237
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객체는 정확한 시간을 나타내며 연관된 시간대 정보가 없음을 기억 하십시오. 당신이를 예를 사용하여 문자열을 날짜로 변환 할 때 NSDateFormatterNSDateFormatter변환 구성된 시간대에서 시간. 따라서 두 NSDate개체 사이의 시간 (초) 은 항상 시간대와 무관합니다.

게다가이 문서 는 Cocoa의 시간 구현이 윤초를 고려하지 않는다고 명시하고 있습니다. 따라서 그러한 정확성이 필요한 경우 자체 구현을 롤링해야합니다.


5
@RalucaGurau : 86400은 하루의 초 수입니다 (예 : 60 초, 60 분, 24 시간). 달에는 그렇게 할 것이 없습니다.
dreamlax

18
모든 날에 86400 초가있는 것은 아닙니다. 사소한 예의 경우 괜찮지 만 실제 세계에서는 좋은 생각이 아닙니다. DST 변경, 윤초 등은 모두 엉망이 될 수 있습니다. NSCalendar는 주어진 하루에 몇 초가 있는지 알려줄 수 있습니다.
NeilInglis 2012-06-07

2
@muthukumar : 아니 iOS에서, 방법은 맥 OS X에서 사용 가능한이 질문에 태그입니다 cocoa아니라 cocoa-touch이 답변은 맥 OS X에 적용되도록
dreamlax

1
두 순간 사이의 일 수는 항상 86400입니다. 인간이 평소보다 한 시간 일찍 일어나기 위해 자신을 속이는 단계에 있는지 여부는 하루 길이가 86400 초라는 사실과 아무런 차이가 없습니다 (도약 무시). 초)
dreamlax 2015-04-21

1
마지막에 +0000이 없으면 null 날짜와 0 값이 항상 diff에있게됩니다. 그러니 그 함정에 빠지지 마십시오.
Volomike

84

다음과 같이 사용할 수 있습니다.

NSDateComponents *components;
NSInteger days;

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

이 방법은 일광 절약 시간이 변경되는 날짜와 같은 상황을 설명한다고 생각합니다.


2
주어진 날짜의 시간을 무시하는 간단한 방법이 있습니까?
미하이 Timar에게

따라서 다른 달력 단위로 변경할 수 있습니다. :) 연도 단위에 사용됩니다.
기술에 정통한

NSDate객체는 이미 시간대에 구애받지 않습니다. 예를 들어 날짜를 구문 분석 할 때 시간대 정보가 제거 NSDateFormatter되어 NSDate객체가 정확한 시간을 나타냅니다. 당신이 이미 가지고있는 경우에 따라서, startDate그리고 endDate이 두 개체가있을 것입니다 X의 별도의 초 수. 시간대는 그것과 아무 관련이 없습니다.
dreamlax

@Benjamin : 왜 그렇게 말합니까?
dreamlax

dreamlax, 당신의 대답은 틀 렸습니다. 단순하고 단순합니다. 표준시 1 월 1 일 정오와 4 월 1 일 정오 사이의 일 수를 계산하면 수식이 작동하지 않습니다. 이것은 게으른 공식이며 개발자는이를 계산하기 위해 NSDateComponents 객체를 사용해야합니다.
Rickster 2015-04-07

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

어디에 date1date2있습니다 NSDate.

또한 다음의 정의에 유의하십시오 NSTimeInterval.

typedef double NSTimeInterval;

NSTimeInterval은 실제로 double이므로 다른 숫자와 마찬가지로 사용할 수 있습니다.
Kendall Helmstetter Gelner 2010

19

이것을 확인하십시오. 그것은 계산에 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 @""; 
}

이 방법은 시차를 계산하는 완벽한 방법입니다.
Moxarth

모든 if 조건과 함께 elseif를 유지할 수 있습니다. 그렇지 않으면 한 가지 형식의 시간 만 표시됩니다.
Moxarth 2017 년

3

Swift 5 및 iOS 12에서는 필요에 따라 다음 두 가지 방법 중 하나를 사용하여 두 날짜의 차이를 찾을 수 있습니다.


#1. 사용 CalendardateComponents(_: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. 사용 DateComponentsFormatterstring(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

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)

모든 날이 그 정도의 시간을 가지는 것은 아닙니다.
Pavan

@Pavan-이 답변을 업데이트하고 개선하여 의견을 공유하는 것을 환영합니다.
Krunal

더 나아지려면 전체 답변을 다시 작성해야합니다.이 경우 하드 코딩 된 값을 사용하지 않는 위의 답변과 동일한 솔루션이기 때문에 삭제 될 수도 있습니다. :)
Pavan

0

날짜를 초 단위로 변환하고이를 위해 1970 년 이후의 시간 간격을 사용하여 차이를 찾을 수 있으며 두 날짜의 차이를 찾을 수 있습니다.


두 날짜를 서로 직접 계산할 수있는 경우 (동일한 시간 도메인 가정). 1970 년 이후로 두 날짜를 먼저 계산 한 다음 차이점을 찾는 특별한 이유가 있습니까?
Adeel

0

차이를 찾으려면 현재 날짜와 미래 날짜를 가져와야합니다. 다음의 경우 미래 ​​날짜의 예로 2 일을 사용했습니다. 계산 방법 :

2 days* 24 hours* 60 minutes* 60 seconds. 2 일의 시간 (초)은 172,800 초가 될 것으로 예상합니다.

// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0

1
답변으로 코드 만 게시하지 말고 코드의 기능과 문제를 해결하는 방법에 대한 설명도 제공하세요. 설명이있는 답변은 일반적으로 품질이 높고 찬성 투표를 유도 할 가능성이 더 높습니다.
Mark Rotteveel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.