[ios] 두 NSDates 사이의 신속한 일

나는 Swift의 두 NSDates / “새로운”Cocoa 사이에 일의 양을 얻을 수있는 새롭고 멋진 가능성이 있는지 궁금합니다.

예를 들어 Ruby에서와 같이 할 것입니다.

(end_date - start_date).to_i



답변

시차도 고려해야합니다. 예를 들어 날짜 2015-01-01 10:00와 를 비교하면 2015-01-02 09:00해당 날짜 간의 차이가 24 시간 미만 (23 시간)이므로 해당 날짜 사이의 날짜는 0 (영)으로 반환됩니다.

두 날짜 사이의 정확한 날짜를 확인하는 것이 목적이라면 다음과 같이이 문제를 해결할 수 있습니다.

// Assuming that firstDate and secondDate are defined
// ...

let calendar = NSCalendar.currentCalendar()

// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDayForDate(firstDate)
let date2 = calendar.startOfDayForDate(secondDate)

let flags = NSCalendarUnit.Day
let components = calendar.components(flags, fromDate: date1, toDate: date2, options: [])

components.day  // This will return the number of day(s) between dates

Swift 3 및 Swift 4 버전

let calendar = Calendar.current

// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: firstDate)
let date2 = calendar.startOfDay(for: secondDate)

let components = calendar.dateComponents([.day], from: date1, to: date2)


답변

Swift 2에 대한 제 대답은 다음과 같습니다.

func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int
{
    let calendar = NSCalendar.currentCalendar()

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])

    return components.day
}


답변

몇 가지 Swift3 답변이 표시되므로 직접 추가하겠습니다.

public static func daysBetween(start: Date, end: Date) -> Int {
   Calendar.current.dateComponents([.day], from: start, to: end).day!
}

명명은 더 신속하고 한 줄이며 최신 dateComponents()방법을 사용합니다 .


답변

Objective-C 답변을 번역했습니다.

let start = "2010-09-01"
let end = "2010-09-05"

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

let startDate:NSDate = dateFormatter.dateFromString(start)
let endDate:NSDate = dateFormatter.dateFromString(end)

let cal = NSCalendar.currentCalendar()


let unit:NSCalendarUnit = .Day

let components = cal.components(unit, fromDate: startDate, toDate: endDate, options: nil)


println(components)

결과

<NSDateComponents: 0x10280a8a0>
     Day: 4

가장 어려운 부분은 자동 완성이 fromDate 및 toDate가라고 주장하는 NSDate?것이지만 실제로 NSDate!참조에 표시된 것과 같아야합니다 .

각 경우에 단위를 다르게 지정하고 싶기 때문에 연산자를 사용한 좋은 솔루션이 어떻게 보일지 모르겠습니다. 시간 간격을 반환 할 수는 있지만 많은 것을 얻지 못할 것입니다.


답변

Date년, 월, 일, 시간, 분, 초의 날짜 차이를 얻는 매우 멋진 확장입니다.

extension Date {

    func years(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.year], from: sinceDate, to: self).year
    }

    func months(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.month], from: sinceDate, to: self).month
    }

    func days(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.day], from: sinceDate, to: self).day
    }

    func hours(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.hour], from: sinceDate, to: self).hour
    }

    func minutes(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.minute], from: sinceDate, to: self).minute
    }

    func seconds(sinceDate: Date) -> Int? {
        return Calendar.current.dateComponents([.second], from: sinceDate, to: self).second
    }

}


답변

Swift 3 iOS 10 Beta 4 업데이트

func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
    let calendar = Calendar.current
    let components = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)
    return components.day!
}


답변

다음은 Swift 3에 대한 답변입니다 (IOS 10 베타 테스트 완료)

func daysBetweenDates(startDate: Date, endDate: Date) -> Int
{
    let calendar = Calendar.current
    let components = calendar.components([.day], from: startDate, to: endDate, options: [])
    return components.day!
}

그러면 이렇게 부를 수 있습니다

let pickedDate: Date = sender.date
let NumOfDays: Int = daysBetweenDates(startDate: pickedDate, endDate: Date())
    print("Num of Days: \(NumOfDays)")