Get Previous, Current and Next Weeks Excluding Saturday and Sunday
Asked Answered
E

1

0

I wants to display dates/days from Monday to Friday excluding Saturday/Sunday as mentioned in the image below.

enter image description here

My Scenario:

  1. When screen loads the current week should display.
  2. On previous button click (DisplayedWeek - 1)
  3. On Next button click (DisplayedWeek + 1).

My Work,

After some research this is what i have tried.

        let calendar = Calendar.current

        let currentDate = calendar.startOfDay(for: Date())

        /* value =  0 for current,
           value =  1 for next,
           value = -1 for previous week.

        */
        let nextWeek:Date =  calendar.date(byAdding: .weekOfMonth, value: 1, to: currentDate)! as Date

        let dayOfWeek = calendar.component(.weekday, from: nextWeek)
        let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: nextWeek)!

        let days = (weekdays.lowerBound ..< weekdays.upperBound).flatMap {

            calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: nextWeek)

        }.filter { !calendar.isDateInWeekend($0) }

        // Week Days from monday to friday
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"

        for date in days {
            print(formatter.string(from: date))
        }

In my case if the day is Saturday or Sunday it should display next week but it is displaying the same week.

Est answered 21/7, 2017 at 13:30 Comment(2)
What "timezone related issues" do you have? Please show a minimal reproducible example which demonstrates the problem clearly.Fruitful
@MartinR some details addedEst
C
4

You can get the current week monday's date, and just add n days to it:

Swift 4.1 • Xcode 9.3 or later

extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
    var cureentWeekMonday: Date {
        return Calendar.iso8601.date(from: Calendar.iso8601.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
    }
    var currentWeekdays: [Date] {
        return (0...4).compactMap{ Calendar.iso8601.date(byAdding: DateComponents(day: $0), to: cureentWeekMonday) } // for Swift versions earlier than 4.1 use flatMap instead
    }
}

let currentWeekdays = Date().currentWeekdays
print(currentWeekdays)  // ["Jul 17, 2017, 12:00 AM", "Jul 18, 2017, 12:00 AM", "Jul 19, 2017, 12:00 AM", "Jul 20, 2017, 12:00 AM", "Jul 21, 2017, 12:00 AM"]
Caterpillar answered 21/7, 2017 at 16:33 Comment(7)
how to display previous/next weeks?Est
When the current day is Saturday or Sunday it display the same week whereas i want to display the next week.Est
Just add or subtract one week to the current week days array elementsCaterpillar
You should add all that extra info to the question. just add a conditional if weekday > friday you get the next week.Caterpillar
Official time in my place is 12:06A.M. your function is also returning Sunday i.e. 2017-07-16, complete output: [2017-07-16 19:00:00 +0000, 2017-07-17 19:00:00 +0000, 2017-07-18 19:00:00 +0000, 2017-07-19 19:00:00 +0000, 2017-07-20 19:00:00 +0000]Est
don't mess with timezone. Use it as it is. To display your date at local time use DateFormatterCaterpillar
ok Got it Thanks sir. using let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" for date in currentWeekdays { print(formatter.string(from: date)) } resolved my problemEst

© 2022 - 2024 — McMap. All rights reserved.