我正在实现一个日历视图,我希望它从包含特定日期的一周开始开始。例如。如果目标日期是 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
method date(from: DateComponents)
通过[.yearForWeekOfYear, .weekOfYear]
任何日期的组件都会从所使用的日历中返回一周的第一天。因此,如果您想获得星期日,只需使用公历即可。如果您想将星期一作为一周的第一天,您可以使用日历.iso8601
正如你所看到的answer https://stackoverflow.com/a/33398047/2303865
Xcode 12 • Swift 5.3 或更高版本(也适用于以前的 Swift 版本)
extension Calendar {
static let gregorian = Calendar(identifier: .gregorian)
}
extension Date {
func startOfWeek(using calendar: Calendar = .gregorian) -> Date {
calendar.dateComponents([.calendar, .yearForWeekOfYear, .weekOfYear], from: self).date!
}
}
usage:
Date().startOfWeek() // "Sep 20, 2020 at 12:00 AM"
如果您想获取特定时区的一周开始时间,您只需要使用自定义日历:
var gregorianUTC = Calendar.gregorian
gregorianUTC.timeZone = TimeZone(identifier: "UTC")!
print(Date().startOfWeek(using: gregorianUTC)) // "2020-09-20 00:00:00 +0000\n"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)