[英]Get the first day of all weeks of current month in iOS swift
您可以使用以下組件創建DateComponents
:
year: someYear,
month: someMonth,
weekday: someCalendar.firstWeekday,
weekOfMonth: n
使用Calendar.date(from:)
獲取與這些組件對應的Date
。 現在您只需要將n
從 1 改變到 5,並將每個結果放入一個數組中。
var firstsOfWeek = [Date]()
let year = 2020
let month = 10
let calendar = Calendar.current
for n in 1...5 {
let dc = DateComponents(
year: year,
month: month,
weekday: calendar.firstWeekday,
weekOfMonth: n
)
firstsOfWeek.append(calendar.date(from: dc)!)
}
然而, date(from:)
將返回不在一個日期someMonth
如果第一周someMonth
只是部分里面someMonth
。 例如,(假設一周從星期日開始)2020 年 10 月的第一周從 9 月 27 日開始,如果您詢問date(from:)
與weekOfMonth: 1
對應的日期是什么,它將為您提供該日期。
如果你不想要那個日期。 只需添加一個檢查以僅包括月份的開始(如果它也是一周的開始),並將 for 循環范圍更改為2...5
:
let firstDayOfMonth = calendar.date(from: DateComponents(year: year, month: month))!
if calendar.component(.weekday, from: firstDayOfMonth) == calendar.firstWeekday {
firstsOfWeek.append(firstDayOfMonth)
}
for n in 2...5 {
...
但請注意,如果您這樣做,結果數組有時會有 4 個元素,有時有 5 個元素。
您可以獲取當前日期的 .yearForWeekOfYear,獲取該日期月份的 weekOfYear 范圍並返回該范圍內同一月份的所有日期:
extension Date {
func month(using calendar: Calendar = .current) -> Int {
calendar.component(.month, from: self)
}
func firstWeekdaysInMonth(using calendar: Calendar = .current) -> [Date] {
var components = calendar.dateComponents([.calendar, .yearForWeekOfYear], from: self)
return calendar.range(of: .weekOfYear, in: .month, for: self)?.compactMap {
components.weekOfYear = $0
return components.date?.month(using: calendar) == month(using: calendar) ? components.date : nil
} ?? []
}
}
另一種選擇是獲取該特定日期的月份開始,在該日期之后 enumerateDates 與日歷的第一個工作日匹配,如果結果日期不在該日期的同一個月,則停止:
extension Date {
func firstWeekdaysInMonth(using calendar: Calendar = .current) -> [Date] {
let year = calendar.component(.year, from: self)
let month = calendar.component(.month, from: self)
let start = DateComponents(calendar: calendar, year: year, month: month).date!
let matching = DateComponents(weekday: calendar.firstWeekday)
var dates: [Date] = []
calendar.enumerateDates(startingAfter: start, matching: matching, matchingPolicy: .strict) { date, _, stop in
guard let date = date, calendar.component(.month, from: date) == month else {
stop = true
return
}
dates.append(date)
}
return dates
}
}
let dates = Date().firstWeekdaysInMonth() // "Oct 4, 2020 at 12:00 AM", "Oct 11, 2020 at 12:00 AM", "Oct 18, 2020 at 12:00 AM", "Oct 25, 2020 at 12:00 AM"]
let august = DateComponents(calendar: .current, year: 2020, month: 8, day: 10).date!
august.firstWeekdaysInMonth() // ["Aug 2, 2020 at 12:00 AM", "Aug 9, 2020 at 12:00 AM", "Aug 16, 2020 at 12:00 AM", "Aug 23, 2020 at 12:00 AM", "Aug 30, 2020 at 12:00 AM"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.