我正在实现一个日历视图,我希望它从包含特定日期的一周开始时开始。例如。如果目标日期为2016年2月29日星期一,并且当前日历设置为从星期日开始,那么我希望从2月28日星期日开始。
这看起来应该很简单:
let calendar = NSCalendar.currentCalendar() let firstDate = calendar.nextDateAfterDate(targetDate, matchingUnit: .Weekday, value: calendar.firstWeekday, options: .SearchBackwards)
但这失败了:
由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“必须指定集合{NSCalendarMatchPreviousTimePreservingSmallerUnits,NSCalendarMatchNextTimePreservingSmallerUnits,NSCalendarMatchNextTime}中的一个选项。”
我基本上可以得到我想要的东西:
let firstDate = calendar.nextDateAfterDate(firstDate, matchingUnit: .Weekday, value: calendar.firstWeekday, options: .MatchPreviousTimePreservingSmallerUnits)? .dateByAddingTimeInterval(-7 * 84600)
但这似乎是一种不好的做法,因为有时一天中的秒数不是86400。
有没有更好的办法?
您可以从任何日期使用Calendar方法date(from: DateComponents)传递[.yearForWeekOfYear, .weekOfYear]组件,该方法会从所使用的日历返回星期的第一天。因此,如果您想获取星期日,请使用公历。如果您希望将星期一作为一周的第一天,则可以使用日历,.iso8601如在此答案中所见
Calendar
date(from: DateComponents)
[.yearForWeekOfYear, .weekOfYear]
.iso8601
Xcode 8.3.2•Swift 3.1或更高版本
extension Calendar { static let gregorian = Calendar(identifier: .gregorian) } extension Date { var startOfWeek: Date? { return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) } }
用法:
Date().startOfWeek // "Oct 15, 2017 at 1:00 AM" (note that daylight savings took effect last Sunday, thats why it shows 1am)