Swift - nextDate() 按年份搜索
Swift - nextDate() search by day of year
希望在这方面得到一些帮助。我正在尝试(向前和向后)搜索以找到下一个与 一年中的某一天相匹配的日期
所以,例如我有一个 300 天的值,我知道我们目前是今年的第 237 天(写这篇文章时 post,25/08/18!),我想要向后搜索以找到一年中第 300 天的前一次出现,并根据它格式化日期。
我已经使用小型日期扩展从日期中提取 'day of year':
extension Date {
var dayOfYear: Int {
return Calendar.current.ordinality(of: .day, in: .year, for: self)!
}
}
使用 Calendar.nextDate() 函数我可以搜索匹配 '.day' ,但这显然是月中的某天,而不是年份:
let potentialSartDate = (Calendar.current as NSCalendar).nextDate(after: nowDate, matching: .day, value: dayOfYearValueToMatch, options: [.matchNextTime, .searchBackwards])!
有没有人对如何执行这样的搜索有任何指示或方法,从结果中构建日期?
提前致谢!
埃米尔
您可以从今天开始获取当前年份组件,并使用 Calendar date(from: DateComponents)
方法获取一年中的第 300 天,如下所示:
extension Calendar {
static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
var year: Int {
return Calendar.current.component(.year, from: self)
}
var last300ThDayOfYear: Date {
return Calendar.current.date(from: DateComponents(calendar: .iso8601, year: dayOfYear > 300 ? year : year - 1, day: 300))!
}
var dayOfYear: Int {
return Calendar.current.ordinality(of: .day, in: .year, for: self)!
}
}
let date = Date().last300ThDayOfYear // "Oct 27, 2017 at 12:00 AM"
print(date.dayOfYear) // 300
希望在这方面得到一些帮助。我正在尝试(向前和向后)搜索以找到下一个与 一年中的某一天相匹配的日期
所以,例如我有一个 300 天的值,我知道我们目前是今年的第 237 天(写这篇文章时 post,25/08/18!),我想要向后搜索以找到一年中第 300 天的前一次出现,并根据它格式化日期。
我已经使用小型日期扩展从日期中提取 'day of year':
extension Date {
var dayOfYear: Int {
return Calendar.current.ordinality(of: .day, in: .year, for: self)!
}
}
使用 Calendar.nextDate() 函数我可以搜索匹配 '.day' ,但这显然是月中的某天,而不是年份:
let potentialSartDate = (Calendar.current as NSCalendar).nextDate(after: nowDate, matching: .day, value: dayOfYearValueToMatch, options: [.matchNextTime, .searchBackwards])!
有没有人对如何执行这样的搜索有任何指示或方法,从结果中构建日期?
提前致谢!
埃米尔
您可以从今天开始获取当前年份组件,并使用 Calendar date(from: DateComponents)
方法获取一年中的第 300 天,如下所示:
extension Calendar {
static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
var year: Int {
return Calendar.current.component(.year, from: self)
}
var last300ThDayOfYear: Date {
return Calendar.current.date(from: DateComponents(calendar: .iso8601, year: dayOfYear > 300 ? year : year - 1, day: 300))!
}
var dayOfYear: Int {
return Calendar.current.ordinality(of: .day, in: .year, for: self)!
}
}
let date = Date().last300ThDayOfYear // "Oct 27, 2017 at 12:00 AM"
print(date.dayOfYear) // 300