Как получить последние дни недели в Swift3 IOS - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над приложением Календарь. Где я должен найти даты прошлой недели и текущей недели. Я могу получить даты текущей недели, используя следующий код:

let dateInWeek = Date()

let calendar = Calendar.current
let dayOfWeek = calendar.component(.weekday, from: dateInWeek)
let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: dateInWeek)!
let dates = (weekdays.lowerBound ..< weekdays.upperBound)
           .flatMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: dateInWeek) }

print(dates)

Здесь массив дат:

[2018-05-13 07:12:44 +0000, 2018-05-14 07:12:44 +0000, 2018-05-15 07:12:44 +0000, 2018-05-16 07: 12:44 +0000, 2018-05-17 07:12:44 +0000, 2018-05-18 07:12:44 +0000, 2018-05-19 07:12:44 +0000]

Как это Может кто-нибудь предложить мне, как я могу получить даты на прошлой неделе из календаря?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

учитывая, что вы находитесь в приложении календаря, давайте повеселимся, вот более сложная реализация.

extension Date {

    // Get Date Array in a certain week, offset by some day
    func datesOfWeek(weekOffset: Int = 0) -> [Date] {

        var dates = [Date]()

        for index in 1...7 {
            if let weekday = Weekday(rawValue: index) {
                let date = dateOfWeek(weekday: weekday, weekOffset: weekOffset)
                dates.append(date)
            }
        }

        return dates
    }

    // Get Date in a certain week, in a certain week day
    func dateOfWeek(weekday targetDayOfWeek: Weekday, weekOffset: Int = 0) -> Date {

        var selfDate = self
        let weekInterval = intervalByDays(days: weekOffset * 7)
        selfDate.addTimeInterval(weekInterval)

        let formattor = DateFormatter()
        formattor.timeZone = TimeZone.current
        formattor.dateFormat = "e"

        if let selfDayOfWeek = Int(formattor.string(from: selfDate)) {
            let interval_days = targetDayOfWeek.rawValue - selfDayOfWeek
            let interval = intervalByDays(days: interval_days)
            selfDate.addTimeInterval(interval)
            return selfDate
        }

        return selfDate
    }

    // for good reading
    enum Weekday: Int {
        case Sunday = 1
        case Monday = 2
        case Tuesday = 3
        case Wednesday = 4
        case Thursday = 5
        case Friday = 6
        case Saturday = 7
    }

    // how many seconds in a day
    private func intervalByDays(days: Int) -> TimeInterval {

        let secondsPerMinute = 60
        let minutesPerHour = 60
        let hoursPerDay = 24

        return TimeInterval(
            days * hoursPerDay * minutesPerHour * secondsPerMinute)
    }
}

Теперь проверьте результат:

let today = Date()

// date of today
// 2018-05-16 13:12:14 +0000
print(today)

// dates of this week
// [2018-05-13 13:12:14 +0000, 2018-05-14 13:12:14 +0000, 2018-05-15 13:12:14 +0000, 2018-05-16 13:12:14 +0000, 2018-05-17 13:12:14 +0000, 2018-05-18 13:12:14 +0000, 2018-05-19 13:12:14 +0000]
print(today.datesOfWeek())

// dates of last week
// [2018-05-06 13:12:14 +0000, 2018-05-07 13:12:14 +0000, 2018-05-08 13:12:14 +0000, 2018-05-09 13:12:14 +0000, 2018-05-10 13:12:14 +0000, 2018-05-11 13:12:14 +0000, 2018-05-12 13:12:14 +0000]
print(today.datesOfWeek(weekOffset: -1))

// dates of next week
// [2018-05-20 13:12:14 +0000, 2018-05-21 13:12:14 +0000, 2018-05-22 13:12:14 +0000, 2018-05-23 13:12:14 +0000, 2018-05-24 13:12:14 +0000, 2018-05-25 13:12:14 +0000, 2018-05-26 13:12:14 +0000]
print(today.datesOfWeek(weekOffset: 1))

// Tuesday of this week
// 2018-05-15 13:18:03 +0000
print(today.dateOfWeek(weekday: .Tuesday))

// Friday of last week
// 2018-05-11 13:18:03 +0000
print(today.dateOfWeek(weekday: .Friday, weekOffset: -1))
0 голосов
/ 16 мая 2018

Это должно работать (по крайней мере, в григорианском календаре):

let dateInWeek = Date()

let calendar = Calendar.current
let dayOfWeek = calendar.component(.weekday, from: dateInWeek)
let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: dateInWeek.addingTimeInterval(60 * 60 * 24 * 7 * -1))!
let dates = (weekdays.lowerBound ..< weekdays.upperBound)
    .flatMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: dateInWeek.addingTimeInterval(60 * 60 * 24 * 7 * -1)) }

print(dates)

Я в основном вычитал 7 дней из обоих случаев dateInWeek.

Это будет работать, если нет некоторыхизменения в том, как работают недели, о которых я не знаю, или Calendar.current - это какой-то календарь, в котором неделя не имеет 7 дней.

...