Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-从今天开始在阵列中获得最后7天_Ios_Arrays_Swift_Days - Fatal编程技术网

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

Ios Swift-从今天开始在阵列中获得最后7天,ios,arrays,swift,days,Ios,Arrays,Swift,Days,如何获得一个月的前7天如果今天是18天我知道如何获得,但是如果今天是11月3日呢?如何获取上个月(10月)最后4天的整数?这可能不是最快的代码。但你明白了:) 使用NSCalendar和NSDateComponents: let cal = NSCalendar.currentCalendar() // start with today var date = cal.startOfDayForDate(NSDate()) var days = [Int]() for i in 1 ... 7

如何获得一个月的前7天如果今天是18天我知道如何获得,但是如果今天是11月3日呢?如何获取上个月(10月)最后4天的整数?

这可能不是最快的代码。但你明白了:)


使用
NSCalendar
NSDateComponents

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)
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)
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)
更新Swift 3(Xcode 8 beta 2):

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)
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)

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

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)!)
}
    let calendar = Calendar.current
    let date = Date()

    let result: [Int] = (-6...0).map { delta -> Int in
        calendar.component(.day, from: calendar.date(byAdding: .day, value: delta, to: date)!)
    }

您想使用
NSCalendar
获取最后7天的时间。下面是一段代码片段,用于在11月3日的活动中演示它:

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .ShortStyle
dateFormatter.timeStyle = .NoStyle
dateFormatter.locale = NSLocale(localeIdentifier: "en_GB")
let date = dateFormatter.dateFromString("03/11/14")!
println("date = \(dateFormatter.stringFromDate(date))")

let calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
var previous7days: Array<Int> = []
for i in 0...6 {
    let prevDate = calendar.dateByAddingUnit(.CalendarUnitDay, value: -i, toDate: date, options:  nil)
    previous7days.insert(calendar.component(.CalendarUnitDay, fromDate: prevDate!), atIndex: 0)
}
println("last 7 days: \(previous7days)")
let dateFormatter=NSDateFormatter()
dateFormatter.dateStyle=.ShortStyle
dateFormatter.timeStyle=.NoStyle
dateFormatter.locale=NSLocale(localeIdentifier:“en_GB”)
让date=dateFormatter.dateFromString(“03/11/14”)!
println(“日期=\(dateFormatter.stringFromDate(日期)))
让calendar=NSCalendar(calendarIdentifier:NSGregorianCalendar)!
var-previous7days:Array=[]
因为我在0…6{
让prevDate=calendar.dateByAddingUnit(.CalendarUnitDay,值:-i,toDate:date,选项:nil)
previous7days.insert(calendar.component(.CalendarUnitDay,fromDate:PreviousDate!),索引:0)
}
println(“最近7天:\(以前7天)”)

我稍微修改了rintaro答案,以获取NSArray NSDictionary中的过去日期,从而获取所有值,包括过去的天数、月份和年份。您只需要像这样调用此代码段

println(getPastDates(2))
得到一份完整的过去日期的清单

( { 日=30; 月=11; 年份=2014年; }, { 日=29; 月=11; 年份=2014年; } )


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

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
        }
    }
}

与@rintaro answer相同的策略,尽可能简短;)(增加了对负值的支持,并将其作为日期扩展,以便能够使用任何日期作为输入)

用法:

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]
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]
我更新

亚历杭德罗·卢恩戈的密码。它工作得很快

func getPastDates(days: Int) -> NSMutableArray {

        let dates = NSMutableArray()
        let calendar = Calendar.current

        var today = calendar.startOfDay(for: Date())

        for _ in 1 ... days {

            let day = calendar.component(.day, from: today)
            let month = calendar.component(.month, from: today)
            let year = calendar.component(.year, from: today)

            let date = NSMutableDictionary()

            date.setValue(day, forKey: "day")
            date.setValue(month, forKey: "month")
            date.setValue(year, forKey: "year")

            dates.add(date)
            today = calendar.date(byAdding: .day, value: -1, to: today)!
        }

        return dates

    }
受到答案的启发

以字符串数组的形式获取以前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
    }
}
用法:

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"]

Swift4

与@MartinR相同的策略,@rintaro-answer,尽可能简短:

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)!)
}
    let calendar = Calendar.current
    let date = Date()

    let result: [Int] = (-6...0).map { delta -> Int in
        calendar.component(.day, from: calendar.date(byAdding: .day, value: delta, to: date)!)
    }

你所说的
Int
是什么意思?Unix时间戳或其他什么?[27,28,29,30,1,2,3]或[28,29,30,31,1,2,3]这取决于月份。每天没有86400秒(想想夏时制和夏时制之间的转换)。使用60*60*24作为一天的持续时间是错误的。是的,这就是为什么你的答案更好;)闰秒是否需要
.startOfDayForDate()
?@rintaro:在处理日期时,我更喜欢定义明确的时间组件。但这并不是真的需要。Unix时间中不考虑闰秒,因此它不起任何作用。@如果您回答我的问题,MartinR将不胜感激@MartinR:What's way to reach the days like
[Dec 26,Dec 27]
this format?@iPeter:使用DateFormatter将日期转换为字符串。您可以在下面的其他答案中找到示例,例如,并非每天都有86400秒(想想夏时制和夏时制之间的转换)。用60*60*24作为一天的持续时间是错误的。谢谢你指出这一点。我们这里没有DST,所以我没想过。我对你的解决方案投了赞成票,因为它正确且更简洁:)很好。我喜欢你使用地图的方式我很感激你D