swift 根据给定周的起始日期和周数获取周范围

7tofc5zh  于 2023-04-04  发布在  Swift
关注(0)|答案(2)|浏览(98)

我的开始日期是2020年7月13日,Int表示我选择的周数,在本例中是5周。我想打印这5周的每个周范围。预期输出的示例:

  1. 7月13日至7月19日
  2. 7月20日至7月26日
  3. 7月27日至8月2日
  4. 8月3日至8月9日
  5. 8月10日至8月16日
    使用下面的代码,我能够获得前两周,但是,周应该继续打印取决于周的输入。
func getRanges() {
    let arrWeekDates = rangeString!.getWeekDates() // Get dates of two weeks.
    let dateFormat = "MMM dd"
    let thisMon = arrWeekDates.thisWeek.first!.toDate(format: dateFormat)
    let thisSun = arrWeekDates.thisWeek[arrWeekDates.thisWeek.count - 1].toDate(format: dateFormat)

    let nextMon = arrWeekDates.nextWeek.first!.toDate(format: dateFormat)
    let nextSun = arrWeekDates.nextWeek[arrWeekDates.nextWeek.count - 1].toDate(format: dateFormat)

    print("This Week: \(thisMon) - \(thisSun)")
    print("Next Week: \(nextMon) - \(nextSun)")
    
}

extension Date {

func getWeekDates() -> (thisWeek:[Date],nextWeek:[Date]) {
        var tuple: (thisWeek:[Date],nextWeek:[Date])
        var arrThisWeek: [Date] = []
        for i in 0..<7 {
            arrThisWeek.append(Calendar.current.date(byAdding: .day, value: i, to: startOfWeek)!)
        }
        var arrNextWeek: [Date] = []
        for i in 1...7 {
            arrNextWeek.append(Calendar.current.date(byAdding: .day, value: i, to: arrThisWeek.last!)!)
        }
        tuple = (thisWeek: arrThisWeek,nextWeek: arrNextWeek)
        return tuple
    }

var startOfWeek: Date {
            let gregorian = Calendar(identifier: .gregorian)
            let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
            return gregorian.date(byAdding: .day, value: 1, to: sunday!)!
        }
func toDate(format: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
   }
fquxozlt

fquxozlt1#

我创建了一个函数,它以开始日期和周数为参数,并返回一个DateInterval数组,表示周的开始日期和结束日期

func weeks(from date: Date, duration: Int) -> [DateInterval]? {
    let calendar = Calendar.current

    //Get date for first day of the week
    let diff = calendar.component(.weekday, from: date) - calendar.firstWeekday
    guard let firstDate = calendar.date(byAdding: .day, value: -(diff < 0 ? 7 + diff : diff), to: date) else {
        return nil
    }

    //Generate start and end date for the duration 
    var weeks = [DateInterval(start: firstDate, end: calendar.date(byAdding: .day, value: 6, to: firstDate)!)]
    for week in 1..<duration {
        guard let firstDayOfWeek = calendar.date(byAdding: .day, value: 7, to: weeks[week - 1].start),
            let lastDayOfWeek = calendar.date(byAdding: .day, value: 6, to: firstDayOfWeek) else { return nil }

        weeks.append(DateInterval(start: firstDayOfWeek, end: lastDayOfWeek))
    }
    return weeks
}

使用它并打印出你能做的

if let weeks = weeks(from: Date(), duration: 5) {
    let formatter = DateFormatter()
    formatter.dateFormat = "MMMM dd"

    for interval in weeks {
        print("\(formatter.string(from: interval.start)) -  \(formatter.string(from: interval.end))")
    }
}

其输出
7月13日至7月19日
7月20日至7月26日
7月27日-8月02日
8月3日-8月9日
8月10日至8月16日

q3qa4bjr

q3qa4bjr2#

最近,我需要从给定的日期中获取一系列的周数,因此,我在@joakim-danielson answer中做了一些更改,并根据我的要求开发了一个代码。

var startDateString = "01/10/2022"
var endDateString = "31/03/2023"
var df = DateFormatter()
df.dateFormat = "dd/MM/yyyy"
let startDate = df.date(from: startDateString)!
let endDate = df.date(from: endDateString)!

func weeks(from date: Date, toDate: Date) -> [DateInterval]? {
    let calendar = Calendar.current

    let diff = calendar.component(.weekday, from: date) - calendar.firstWeekday
    guard let firstDate = calendar.date(byAdding: .day, value: -(diff < 0 ? 7 + diff : diff), to: date) else {
        return nil
    }

    let sunday = Calendar.current.date(from: Calendar.current.dateComponents([.yearForWeekOfYear, .weekOfYear], from: toDate))
    let startDateOfWeek = Calendar.current.date(byAdding: .day, value: 1, to: sunday!)
    
    var weeks = [DateInterval(start: firstDate, end: calendar.date(byAdding: .day, value: 6, to: firstDate)!)]
    
    var actualFirstDate = Date()
    var i: Int = 1
    
    repeat {
        guard let firstDayOfWeek = calendar.date(byAdding: .day, value: 7, to: weeks[i - 1].start),
              let lastDayOfWeek = calendar.date(byAdding: .day, value: 6, to: firstDayOfWeek) else { return nil }
        weeks.append(DateInterval(start: firstDayOfWeek, end: lastDayOfWeek))
        actualFirstDate = Calendar.current.date(byAdding: .day, value: 1, to: firstDayOfWeek)!
        i += 1
    } while startDateOfWeek != actualFirstDate
    
    return weeks
}

if let weeks = weeks(from: startDate, toDate: endDate) {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"

    for interval in weeks {
        print("\(formatter.string(from: interval.start)) - \(formatter.string(from: interval.end))")
    }
}

输出:
25/09/2022 - 01/10/2022
2022年10月2日-2022年10月8日
2022年10月9日至10月15日
2022年10月16日至2022年10月22日
23/10/2022 - 29/10/2022
2022年10月30日-2022年11月5日
2022年11月6日-2022年11月12日
2022年11月13日至11月19日
20/11/2022 - 26/11/2022
2022年11月27日-2022年12月3日
2022年12月4日至12月10日
2022年12月11日至12月17日
2022年12月18日至2022年12月24日
25/12/2022 - 31/12/2022
2023年1月1日-2023年1月7日
2023年1月8日至14日
2023年1月15日-2023年1月21日
2023年1月22日至2023年1月28日
2023年1月29日-2023年2月4日
2023年2月5日至2023年2月11日
2023年2月12日至2023年2月18日
2023年2月19日至2023年2月25日
2023年2月26日至2023年3月4日
2023年3月5日至11月3日
2023年3月12日至3月18日
2023年3月19日-2023年3月25日
2023年3月26日-2023年4月1日

相关问题