簡體   English   中英

在iOS swift中獲取當月所有周的第一天

[英]Get the first day of all weeks of current month in iOS swift

在此處輸入圖片說明

我需要在圖表的 xAxis 上顯示當前月份/第一個工作日 誰能幫我解決這個問題? 我怎樣才能獲得當月所有星期的第一天。

您可以使用以下組件創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM