从 swift 中的数组获取开始日期和结束日期之间的日期
Getting dates between startdate and enddate from array in swift
由于我是 swift 的新手,我在这里停留的时间很长,我试图从开始日期和结束日期之间的数组中获取日期。
我已经尝试了这些引用自[ But I am getting the error as "Value of type '[Date]' has no member 'filtered'".
的代码
在swift
var predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
var result = arrayWithDates.filtered(using: predicate)
Expected output:
dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
startdate = "13/01/1996"
enddate = "17/01/1996"
output = ["13/01/1996","15/01/1996","17/01/1996"]
请帮助我实现这一目标,在此先感谢
你可以这样做:
import Foundation
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
let startdate = dateFormatter.date(from: "13/01/1996")!
let enddate = dateFormatter.date(from: "17/01/1996")!
let output = dateArray
// Map your strings to Date objects excluding nils.
.compactMap { dateFormatter.date(from: [=10=]) }
// Filter the mapped array by your condition.
.filter { [=10=] >= startdate && [=10=] <= enddate }
你可以试试下面的代码,它对我有用:
class ViewController: UIViewController {
var arrDates = NSArray()
var arrResultDates = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
arrDates = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
let strStartDate = "\(arrDates.firstObject!)"
let strEndDate = "\(arrDates.lastObject!)"
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
//Get start date
var startDate = formatter.date(from: strStartDate)
let endDate = formatter.date(from: strEndDate) // last date
// Formatter for printing the date, adjust it according to your needs:
let fmt = DateFormatter()
fmt.dateFormat = "dd/MM/yyyy"
let calendar = NSCalendar.current
while startDate! <= endDate! {
startDate = calendar.date(byAdding: .day, value: 1, to: startDate!)!
let strDate = fmt.string(from: startDate!)
if arrDates.contains(strDate)
{
arrResultDates.add(strDate)
}
}
print(arrResultDates)
}
希望对您有所帮助:)
如果你真的需要使用 NSPredicate
你必须将数组桥接到 NSArray
以响应 filtered(using:
let predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
let result = (arrayWithDates as NSArray).filtered(using: predicate)
但是在 Swift 的世界中,不推荐这样做。只需使用带闭包的 filter
函数
let result = arrayWithDates.filter { [=11=] >= startdate! && [=11=] <= enddate! }
由于我是 swift 的新手,我在这里停留的时间很长,我试图从开始日期和结束日期之间的数组中获取日期。
我已经尝试了这些引用自[ But I am getting the error as "Value of type '[Date]' has no member 'filtered'".
在swift
var predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
var result = arrayWithDates.filtered(using: predicate)
Expected output:
dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
startdate = "13/01/1996"
enddate = "17/01/1996"
output = ["13/01/1996","15/01/1996","17/01/1996"]
请帮助我实现这一目标,在此先感谢
你可以这样做:
import Foundation
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
let startdate = dateFormatter.date(from: "13/01/1996")!
let enddate = dateFormatter.date(from: "17/01/1996")!
let output = dateArray
// Map your strings to Date objects excluding nils.
.compactMap { dateFormatter.date(from: [=10=]) }
// Filter the mapped array by your condition.
.filter { [=10=] >= startdate && [=10=] <= enddate }
你可以试试下面的代码,它对我有用:
class ViewController: UIViewController {
var arrDates = NSArray()
var arrResultDates = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
arrDates = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
let strStartDate = "\(arrDates.firstObject!)"
let strEndDate = "\(arrDates.lastObject!)"
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
//Get start date
var startDate = formatter.date(from: strStartDate)
let endDate = formatter.date(from: strEndDate) // last date
// Formatter for printing the date, adjust it according to your needs:
let fmt = DateFormatter()
fmt.dateFormat = "dd/MM/yyyy"
let calendar = NSCalendar.current
while startDate! <= endDate! {
startDate = calendar.date(byAdding: .day, value: 1, to: startDate!)!
let strDate = fmt.string(from: startDate!)
if arrDates.contains(strDate)
{
arrResultDates.add(strDate)
}
}
print(arrResultDates)
}
希望对您有所帮助:)
如果你真的需要使用 NSPredicate
你必须将数组桥接到 NSArray
以响应 filtered(using:
let predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
let result = (arrayWithDates as NSArray).filtered(using: predicate)
但是在 Swift 的世界中,不推荐这样做。只需使用带闭包的 filter
函数
let result = arrayWithDates.filter { [=11=] >= startdate! && [=11=] <= enddate! }