Ios Swift-从今天开始在阵列中获得最后7天
如何获得一个月的前7天如果今天是18天我知道如何获得,但是如果今天是11月3日呢?如何获取上个月(10月)最后4天的整数?这可能不是最快的代码。但你明白了:)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
使用
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