gpt4 book ai didi

ios - Swift 理解 Calendar.dateComponents 结果的问题

转载 作者:可可西里 更新时间:2023-11-01 01:17:15 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个联系人列表,包括联系人的生日。现在我想看看我的哪些联系人在接下来的 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。因此,我没有返回 1 的 difference.day,而是收到 364。如果我在 dateComponents 中交换 from: 和 to:,我收到的 difference.day 为 -364。

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

再次在 Playground

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

我做错了什么?

谢谢

最佳答案

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

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
}

关于ios - Swift 理解 Calendar.dateComponents 结果的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com