【发布时间】:2015-10-08 07:10:25
【问题描述】:
我正在制作一个时间表应用程序,并且我有一个方法可以将当前日期增加 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() 返回 11-10-2015。
所以这正常工作,但是如果我们以今年为例,29-12-2015.dateAtWeekStart() 返回 04-01-2015 而不是 03-01-2016。
顺便说一句,设备上的地区设置为丹麦。
dateAtWeekStart,来自 malcommac 制作的名为 SwiftDate 的帮助器类:https://github.com/malcommac/SwiftDate
更新编辑:
我仍然无法弄清楚如何解决这个问题,我尝试向组件添加年份,如下所示:components.year = self.year,但在返回组件时出于某种原因将年份设置为 2014..
【问题讨论】:
-
你试过
NSCalendar.autoupdatingCurrentCalendar().dateFromComponents(components)!吗? -
不,我没试过。刚试了一下,很遗憾,它不起作用。
-
我认为您可能需要在组件中考虑年份,因为您的标志包含
NSCalendarUnit.Year。我怀疑它实际上是在 2015 年的第一个星期日 - 这是 04-01 -
当没有提供足够的组件来完全指定绝对时间时,日历会使用其选择的默认值 - Apple Doc,这可能会非常不可预测
-
听起来好像是这样,我试试,谢谢。