问题描述
我正在尝试创建一个带有日期名称和日期的周历。我怎样才能得到相同的。我知道之前多次问过类似的问题,但我没有找到准确的答案。目前只能获得一周的日期。如何获取日期名称和日期。下面是我的代码:
^[\**+Error]
输出:
extension Calendar {
static let gregorian = Calendar(identifier: .gregorian)
}
extension Date {
var startingDayOfWeek: Date {
return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear,.weekOfYear],from: self))!
}
var daysOfWeek: [Date] {
let startOfWeek = self.startingDayOfWeek
return (0...6).compactMap{ Calendar.current.date(byAdding: .day,value: $0,to: startOfWeek)}
}
}
print(Date().daysOfWeek)
解决方法
在以上评论的帮助下修复了
let calendar = Calendar.current
let today = calendar.startOfDay(for: Date())
let dayOfWeek = calendar.component(.weekday,from: today)
let weekdays = calendar.range(of: .weekday,in: .weekOfYear,for: today)!
let days = (weekdays.lowerBound ..< weekdays.upperBound)
.compactMap { calendar.date(byAdding: .day,value: $0 - dayOfWeek,to: today) } // use `flatMap` in Xcode versions before 9.3
.filter { !calendar.isDateInWeekend($0) }
let formatter = DateFormatter()
formatter.dateFormat = "EEEE,MMM d,yyyy"//"eeee' = 'D"
let strings = days.map { formatter.string(from: $0) }
print(strings)
输出:
["Monday,May 31,2021","Tuesday,Jun 1,"Wednesday,Jun 2,"Thursday,Jun 3,"Friday,Jun 4,2021"]
,
代码
public extension Calendar {
struct Weekday: CustomStringConvertible {
let date: Date
let name: String?
public var description: String {
"\(name ?? "UNKNOWN") \(date)"
}
}
var currentWeekDateInterval: DateInterval? {
self.dateInterval(of: .weekOfYear,for: Date())
}
var currentWeekdays: [Weekday] {
var weekdays: [Weekday] = []
if let week = self.currentWeekDateInterval {
let start = week.start
let comps = self.dateComponents([.hour,.minute,.second],from: start)
let weekdaySymbols = self.weekdaySymbols
self.enumerateDates(startingAfter: start,matching: comps,matchingPolicy: .strict,using: { (nextDate,_,shouldStop) in
if let nextDate = nextDate {
var dayName: String?
if var dayIndex = self.ordinality(of: .weekday,for: nextDate) {
dayIndex -= 1
if dayIndex >= 0,dayIndex < weekdaySymbols.count {
dayName = weekdaySymbols[dayIndex]
}
}
weekdays.append(Weekday(date: nextDate,name: dayName))
if nextDate >= week.end {
shouldStop = true
}
}
})
}
return weekdays
}
}
用法
let weekdays = Calendar.current.currentWeekdays
输出
(lldb) po weekdays.map({ $0.description })
▿ 7 elements
- 0 : "Monday 2021-05-30 18:30:00 +0000"
- 1 : "Tuesday 2021-05-31 18:30:00 +0000"
- 2 : "Wednesday 2021-06-01 18:30:00 +0000"
- 3 : "Thursday 2021-06-02 18:30:00 +0000"
- 4 : "Friday 2021-06-03 18:30:00 +0000"
- 5 : "Saturday 2021-06-04 18:30:00 +0000"
- 6 : "Sunday 2021-06-05 18:30:00 +0000"