我有两个日期,起始日期和结束日期,需要将它们以数组的形式列出来并存入数据库(core data)中。起始日期和结束日期以字符串形式存在数据库中。
日期格式为MM/dd/yyyy。
// minDate and maxDate represent your date range
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *days = [[NSDateComponents alloc] init];
NSInteger dayCount = 0;
while ( TRUE ) {
[days setDay: ++dayCount];
NSDate *date = [gregorianCalendar dateByAddingComponents: days toDate: minDate options: 0];
if ( [date compare: maxDate] == NSOrderedDescending )
break;
// Do something with date like add it to an array, etc.
}
[days release];
[gregorianCalendar release];
我有一个更通用的方法来使用NSCalendarUnit
定义日期之间的步长,并且处理归一化的日期。
iOS 8 API, Swift 2.0
func generateDates(calendarUnit: NSCalendarUnit, startDate: NSDate, endDate: NSDate) -> [NSDate] {
let calendar = NSCalendar.currentCalendar()
let normalizedStartDate = calendar.startOfDayForDate(startDate)
let normalizedEndDate = calendar.startOfDayForDate(endDate)
var dates = [normalizedStartDate]
var currentDate = normalizedStartDate
repeat {
currentDate = calendar.dateByAddingUnit(calendarUnit, value: 1, toDate: currentDate, options: NSCalendarOptions.MatchNextTime)!
dates.append(currentDate)
} while !calendar.isDate(currentDate, inSameDayAsDate: normalizedEndDate)
return dates
}
calendar.date(byAdding: calendarUnit, value: 1, to: currentDate)!
- Timur Bernikovichfunc ...(lhs:NSDate, rhs:NSDate) -> [NSDate] {
var dates: [NSDate] = []
var cal = NSCalendar.currentCalendar() // or NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
var days = NSDateComponents()
var dayCount = 0
while true {
days.day = dayCount
let date:NSDate = cal.dateByAddingComponents(days, toDate: lhs, options: NSCalendarOptions.allZeros)!
if date.compare(rhs) == .OrderedDescending {
break
}
dayCount += 1
dates.append(date)
}
return dates
}
let fromDate = NSDate(timeIntervalSince1970: 1440711319)
let toDate = NSDate(timeIntervalSince1970: 1441316129)
fromDate...toDate // => ["Aug 27, 2015, 2:19 PM", "Aug 28, 2015, 2:19 PM", "Aug 29, 2015, 2:19 PM", "Aug 30, 2015, 2:19 PM", "Aug 31, 2015, 2:19 PM", "Sep 1, 2015, 2:19 PM", "Sep 2, 2015, 2:19 PM", "Sep 3, 2015, 2:19 PM"]
func ...(lhs:Date, rhs:Date) -> [Date] {
var dates = [Date]()
let cal = NSCalendar.current
var days = DateComponents()
var dayCount = 0
while true {
days.day = dayCount
let date = cal.date(byAdding: days, to: lhs)!
if date.compare(rhs) == .orderedDescending {
break
}
dayCount += 1
dates.append(date)
}
return dates
}
Swift 3.0:
假设您想从今天开始获取日期数组,直到未来的60天。
extension Date {
func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date]
{
let calendar = Calendar.current
var datesArray: [Date] = [Date] ()
for i in 0 ... value {
if let newDate = calendar.date(byAdding: addbyUnit, value: i + 1, to: startDate!) {
datesArray.append(newDate)
}
}
return datesArray
}
}
使用方法:
var datesArrayByAddingDays:[Date]?
override func viewWillAppear(_ animated: Bool) {
datesArrayByAddingDays = Date().generateDates(startDate: Date(), addbyUnit: .day, value: 60)
}