Swift了解Calendar.dateComponents结果的问题

时间:2017-08-18 07:09:49

标签: ios swift calendar

在我的应用中,我有一个联系人列表,包括联系人生日。 现在我希望在接下来的7天内看到我的哪些联系人有生日。 我在列表中使用过滤器来过滤并仅返回匹配

的联系人
     let timeSpan = 7
     let cal = Calendar.current
     let now = Date()
     var birthDays = contactList.filter { (contact) -> Bool in
        if let birthDate = contact.birthDate {
            let difference = cal.dateComponents([.day,.year], from: birthDate as Date, to: now! )
            print("BD:\(birthDate) : DIFF \(difference.day!)")
            return ((difference.day! <= timeSpan) && difference.day! >= 0)
        }
        return false
    }

我的希望是如此。然而,结果是经过的。因此,为了看到“差异”的结果,我在封口中添加了难看的印刷品

奇怪的是,例如以下内容: 今天是2017-08-18我的一个联系方式是1987-08-19出生的。 因此,我没有返回差异。我得到364.如果我从:交换到:在dateComponents中我收到差异。日期为-364。

我的期望是有所不同。天= 1。

再次在游乐场

import UIKit
var now = Date()
let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "yyyy-MM-dd"
let s = dateFormatter.date(from: "1987-08-19")

let cal = Calendar.current

let difference = cal.dateComponents([Calendar.Component.day,Calendar.Component.month,Calendar.Component.year], from: s!, to: now )
print("\(difference.day!)") // result is difference.day = 30

我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

问题是你正在检查用户生日的天数差异,但在应用程序中我们需要获得当前日期和今年生日之间的差异。在你说过的例子中说,这是2017-08-19(今年的生日)和2017-08-18(当前日期)之间的差异。你可以试试下面的代码。

var now = Date()

dateFormatter.dateFormat = "yyyy-MM-dd"
let s = dateFormatter.date(from: "1987-08-19")

let cal = Calendar.current

let currentDateComponentsYear = cal.dateComponents([.year,.month,.day], from: newDate!)

var dateComponents = cal.dateComponents([.year,.month,.day], from: s!)
dateComponents.year = currentDateComponentsYear.year
let currentYearBDay = cal.date(from: dateComponents)
currentDateComponentsYear.month
let difference = cal.dateComponents([Calendar.Component.year,Calendar.Component.month,Calendar.Component.day], from:newDate! , to: currentYearBDay! )
let daysDiffernce:Int?
if dateComponents.month == 1 && currentDateComponentsYear.month == 12 && difference.day! < 0 {
    let range = cal.range(of: .day, in: .month, for: newDate!)!
    let numDays = range.count
    daysDiffernce = difference.day! + numDays

} else {
    daysDiffernce = difference.day
}

print("\(daysDiffernce!)") //result 1

答案 1 :(得分:1)

您可以创建一个扩展程序,以便返回下一个生日的天数,如下所示:

extension Date {
    var year:  Int { return Calendar.current.component(.year, from: self)  }
    var month: Int { return Calendar.current.component(.month, from: self) }
    var day:   Int { return Calendar.current.component(.day, from: self)   }
    var noon: Date { return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)! }
    var daysFromBirthday: Int {
        let nextBirthDate = DateComponents(calendar: .current, year: Date().year + (month < Date().month ? 1 : 0), month: month, day: day, hour: 12).date ?? Date.distantFuture
        return Calendar.current.dateComponents([.day], from: Date().noon, to: nextBirthDate).day ?? 0
    }
}

现在您可以按照以下步骤过滤对象:

let timeSpan = 0...7

let birthDays = contactList.filter {
    timeSpan ~= $0.birthDate?.daysFromBirthday ?? -1
}