Swift - 从今天开始在阵列中获得最近7天

Bog*_*nov 7 arrays days ios swift

如何获得本月的前7天我知道如果今天是18岁,但如果今天是11月3日怎么办?如何获取Int上个月(10月)的最后4天?

Mar*_*n R 27

使用NSCalendarNSDateComponents:

let cal = NSCalendar.currentCalendar()
// start with today
var date = cal.startOfDayForDate(NSDate())

var days = [Int]()

for i in 1 ... 7 {
    // get day component:
    let day = cal.component(.DayCalendarUnit, fromDate: date)
    days.append(day)

    // move back in time by one day:
    date = cal.dateByAddingUnit(.DayCalendarUnit, value: -1, toDate: date, options: nil)!
}

println(days)
Run Code Online (Sandbox Code Playgroud)

Swift 2.2更新(Xcode 7.3.1):

let cal = NSCalendar.currentCalendar()
var date = cal.startOfDayForDate(NSDate())
var days = [Int]()
for i in 1 ... 7 {
    let day = cal.component(.Day, fromDate: date)
    days.append(day)
    date = cal.dateByAddingUnit(.Day, value: -1, toDate: date, options: [])!
}
print(days)
Run Code Online (Sandbox Code Playgroud)

Swift 3更新(Xcode 8 beta 2):

let cal = Calendar.current
var date = cal.startOfDay(for: Date())
var days = [Int]()
for i in 1 ... 7 {
    let day = cal.component(.day, from: date)
    days.append(day)
    date = cal.date(byAdding: .day, value: -1, to: date)!
}
print(days)
Run Code Online (Sandbox Code Playgroud)


Zai*_*han 7

受到这个答案的启发,

获取前N天的列表作为字符串数组。

extension Date {
    static func getDates(forLastNDays nDays: Int) -> [String] {
        let cal = NSCalendar.current
        // start with today
        var date = cal.startOfDay(for: Date())

        var arrDates = [String]()

        for _ in 1 ... nDays {
            // move back in time by one day:
            date = cal.date(byAdding: Calendar.Component.day, value: -1, to: date)!

            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd"
            let dateString = dateFormatter.string(from: date)
            arrDates.append(dateString)
        }
        print(arrDates)
        return arrDates
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let last7Days = Date.getDates(forLastNDays: 7)
debugPrint(last7Days)

//Today(2017-11-19) it prints: ["2017-11-18", "2017-11-17", "2017-11-16", "2017-11-15", "2017-11-14", "2017-11-13", "2017-11-12"]
Run Code Online (Sandbox Code Playgroud)


rin*_*aro 6

与@MartinR相同的策略,尽可能短:

let cal = NSCalendar.currentCalendar()
let date = NSDate()

var result = map(-6...0) { delta -> Int in
    cal.component(.DayCalendarUnit, fromDate: cal.dateByAddingUnit(.DayCalendarUnit, value: delta, toDate: date, options: nil)!)
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 5

您可以使用日历创建扩展程序,以帮助您进行日历计算:

Swift 3或更高版本

extension Date {
    var day: Int {
        return Calendar.current.component(.day, from: self)
    }
    func adding(days: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: days, to: self)!
    }
    var last7days: [Int] {
        return (1...7).map { 
            adding(days: -$0).day
        }
    }
    func near(days: Int) -> [Int] {
        return days == 0 ? [day] : (1...abs(days)).map {
            adding(days: $0 * (days < 0 ? -1 : 1) ).day
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let last7Days  = Date().last7days   // [29, 28, 27, 26, 25, 24, 23]
let last7Days2 = Date().near(days: -7) // [29, 28, 27, 26, 25, 24, 23]
let next7Days  = Date().near(days: 7) // [27, 28, 29, 30, 31, 1, 2]
Run Code Online (Sandbox Code Playgroud)

与@rintaro答案相同的策略,尽可能短;)(增加了对负值的支持,并使其成为Date扩展名,从而可以使用任何日期作为输入)

extension Date {
    func closest(days: Int) -> [Int] {
        return days == 0 ? [] : (1...abs(days)).map { delta -> Int in Calendar.current.component(.day, from: Calendar.current.date(byAdding: .day, value: delta * (days >= 0 ? 1 : -1), to: self)!) }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let next7Days2 = Date().closest(days: 7) // [27, 28, 29, 30, 31, 1, 2]
let last7Days3 = Date().closest(days: -7) // [25, 24, 23, 22, 21, 20, 19]
let next2Days = Date().closest(days: 2) // [27, 28]
let last2Days = Date().closest(days: -2) // [25, 24]
Run Code Online (Sandbox Code Playgroud)