我正在制作一个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/

10-12 13:46