我正在制作一个TimeTable应用程序,并且我有一种方法可以将当前日期添加1周,按预期的方式运行,但是如果该周从12月过渡到1月,则将增加1天。
这是我的代码:
func getWeekDates(var date: NSDate) -> [NSDate] {
var dates: [NSDate] = [NSDate]()
for var i = 0; i < 5; i++ {
date = date.dateAtWeekStart() + 1.day - 1.week
date += i.day
dates.append(date)
}
return dates
}
和
dateAtWeekStart()
:func dateAtWeekStart() -> NSDate {
let flags : NSCalendarUnit = [NSCalendarUnit.Year,NSCalendarUnit.Month ,
NSCalendarUnit.WeekOfYear,
NSCalendarUnit.Weekday]
let components = NSCalendar.currentCalendar().components(flags, fromDate: self)
components.weekday = 1 // Sunday
components.hour = self.hour
components.minute = self.minute
components.second = self.second
return NSCalendar.currentCalendar().dateFromComponents(components)!
}
(
dateAtWeekStart()
是NSDate扩展中的函数)我要添加1天并删除1周的原因是因为dateAtWeekStart返回下一个星期日,所以例如08-10-2015。
dateAtWeekStart()
返回2015年11月10日。因此,这正常工作正常,但是如果以今年(2015年12月29日)为例。
dateAtWeekStart()
返回2015年4月1日,而不是2016年3月1日。顺便说一句,设备上的区域设置为丹麦。
dateAtWeekStart来自于由malcommac制作的名为SwiftDate的帮助程序类:https://github.com/malcommac/SwiftDate
更新编辑:
我仍然无法弄清楚如何解决此问题,我尝试将年份添加到组件中,例如:
components.year = self.year
,但是由于返回组件的某种原因,它将年份设置为2014年。 最佳答案
该dateAtWeekStart()
方法根本不起作用。[.YearForWeekOfYear, .WeekOfYear]
足以作为日历单位
唯一确定一周的开始时间。额外的单位可以使
计算不确定。你也不能只设置components.weekday = 1
,因为在某些地区,星期一(2)是第一个
一周中的天。
所以实际上有点简单:
extension NSDate {
func dateAtWeekStart() -> NSDate {
let cal = NSCalendar.currentCalendar()
// cal.firstWeekday = 1 // If you insist on Sunday being the first day of the week.
let flags : NSCalendarUnit = [.YearForWeekOfYear, .WeekOfYear]
let components = cal.components(flags, fromDate: self)
return cal.dateFromComponents(components)!
}
}
这在所有情况下都应该有效,并为给定日期指定一周的开始时间(午夜)。还有其他方法
可以使用,例如
rangeOfUnit()
。如果您想将星期日视为一周的第一天
而不是使用用户的区域设置
那么您必须设置日历的
firstWeekday
属性。在日期上加上几天或几周的代码看起来也很可疑。
SwiftDate项目中
Int
的扩展方法一天为24 * 60 * 60秒。这是不正确的,因为在
夏令时,一天中的时钟可以有23或25个小时
被调整。向日期添加一个星期的正确方法是
再次使用日历组件:
date = cal.dateByAddingUnit(.WeekOfYear, value: 1, toDate: date, options: [])!
Swift 3的更新:
extension Date {
func dateAtWeekStart() -> Date {
var cal = Calendar.current
// cal.firstWeekday = 1 // If you insist on Sunday being the first day of the week.
let components = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
return cal.date(from: components)!
}
}
关于ios - Swift-NSDate和一年中的最后一周,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33008963/