简体   繁体   English

如何在两个日期之间获取每个星期五的日期?

[英]How to get dates for every Friday between two dates?

I currently use the following code to return an array of dates for every single day between two dates, including today's date and the last date itself.我目前使用以下代码返回两个日期之间每一天的日期数组,包括今天的日期和最后一个日期本身。 This works great.这很好用。

  • However, how would I go about modifying what I'm already doing in order to do the same exact thing otherwise, but instead return an array of the date of every Friday between the dates?但是,我将如何修改我已经在做的事情以便做同样的事情,而是返回日期之间每个星期五的日期数组? For example, if the function was called on Wed Oct 23rd 2019 to return every Friday until November 10th, the first date would be Fri the 25th, Nov 1st, and then Nov 8th.例如,如果 function 于 2019 年 10 月 23 日星期三在每个星期五返回,直到 11 月 10 日,第一个日期将是 25 日星期五、11 月 1 日和 11 月 8 日。
  • How would I do the same thing as above but for the 1st of every month?除了每个月的第一天,我将如何做与上述相同的事情? If I called the function on Wed Oct 23rd 2019 to return the first of every month until December 16th.如果我在 2019 年 10 月 23 日星期三致电 function 以返回每个月的第一天,直到 12 月 16 日。 The array should have Nov 1st and Dec 1st in it.该数组应包含 11 月 1 日和 12 月 1 日。
func dates(for date: String) -> [String] {
    // first get the endDate
    guard var endDate = Formatter.date.date(from: date) else { return [] }
    // for calendrical calculations you should use noon time
    endDate = Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: endDate)!
    // lets get todays noon time to start
    var date = Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: Date())!
    var dates: [String] = []
    // while date less than or equal to end date
    while date <= endDate {
        // add the formatted date to the array
        dates.append( Formatter.date.string(from: date))
        // increment the date by one day
        date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
    }

    return dates
}

You just need to add a weekday parameter to your method and check if the weekday of the date inside the loop before adding it to your array:您只需要在您的方法中添加一个工作日参数,并在将其添加到您的数组之前检查循环内的日期是否为工作日:

extension Formatter {
    static let date = DateFormatter()
}

func dates(for date: String, weekday: Int? = nil) -> [String] {
    Formatter.date.locale = Locale(identifier: "en_US_POSIX")
    Formatter.date.dateFormat = "yyyy-MM-dd"
    // first get the endDate
    guard var endDate = Formatter.date.date(from: date) else { return [] }
    // for calendrical calculations you should use noon time
    endDate = Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: endDate)!
    // lets get todays noon time to start
    var date = Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: Date())!
    var dates: [String] = []
    // while date less than or equal to end date
    while date <= endDate {
        if weekday == nil {
            dates.append(Formatter.date.string(from: date))
            date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
        } else if let weekday = weekday, Calendar.current.component(.weekday, from: date) == weekday {
            // add the formatted date to the array
            dates.append(Formatter.date.string(from: date))
            date = Calendar.current.date(byAdding: .weekOfYear, value: 1, to: date)!
        } else {
            date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
        }
    }
    return dates
}

dates(for: "2019-12-25")  // ["2019-10-23", "2019-10-24", "2019-10-25", "2019-10-26", "2019-10-27", "2019-10-28", "2019-10-29", "2019-10-30", "2019-10-31", "2019-11-01", "2019-11-02", "2019-11-03", "2019-11-04", "2019-11-05", "2019-11-06", "2019-11-07", "2019-11-08", "2019-11-09", "2019-11-10", "2019-11-11", "2019-11-12", "2019-11-13", "2019-11-14", "2019-11-15", "2019-11-16", "2019-11-17", "2019-11-18", "2019-11-19", "2019-11-20", "2019-11-21", "2019-11-22", "2019-11-23", "2019-11-24", "2019-11-25", "2019-11-26", "2019-11-27", "2019-11-28", "2019-11-29", "2019-11-30", "2019-12-01", "2019-12-02", "2019-12-03", "2019-12-04", "2019-12-05", "2019-12-06", "2019-12-07", "2019-12-08", "2019-12-09", "2019-12-10", "2019-12-11", "2019-12-12", "2019-12-13", "2019-12-14", "2019-12-15", "2019-12-16", "2019-12-17", "2019-12-18", "2019-12-19", "2019-12-20", "2019-12-21", "2019-12-22", "2019-12-23", "2019-12-24", "2019-12-25"]
dates(for: "2019-12-25", weekday: 6) // ["2019-10-25", "2019-11-01", "2019-11-08", "2019-11-15", "2019-11-22", "2019-11-29", "2019-12-06", "2019-12-13", "2019-12-20"]

func firstDayOfTheMonth(until date: String) -> [String] {
    Formatter.date.locale = Locale(identifier: "en_US_POSIX")
    Formatter.date.dateFormat = "yyyy-MM-dd"
    guard let endDate = Formatter.date.date(from: date) else { return [] }
    var date = Date()
    var dates: [String] = []
    // while date less than or equal to end date
    while let firstDayOfTheMonth = Calendar.current.nextDate(after: date, matching: .init(day: 1), matchingPolicy: .nextTime), firstDayOfTheMonth <= endDate {
        dates.append(Formatter.date.string(from: firstDayOfTheMonth))
        date = firstDayOfTheMonth
    }
    return dates
}

firstDayOfTheMonth(until: "2019-12-25")  // ["2019-11-01", "2019-12-01"]

You can get the weekday for any day of the week with:您可以通过以下方式获取一周中任何一天的工作日:

let weekDayIndex = Calendar.current.component(.weekday, from: Date())

Friday happens to be day 5. You can get the name of any day with:星期五恰好是第 5 天。您可以通过以下方式获取任何一天的名称:

print(Calendar.current.weekdaySymbols[weekDayIndex])

So just loop over all of your dates and filter out anything where the weekday is not 5 and you have your answer:因此,只需遍历所有日期并过滤掉工作日不是 5 的任何内容,您就会得到答案:

func fridays(in dates: [Date]) {
  dates.filter { Calendar.current.component(.weekday, from: $0) == 5 }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM