Получение даты недели - PullRequest
       7

Получение даты недели

0 голосов
/ 28 сентября 2018

Мне нужно получить все даты недели за текущий месяц, только когда я нажал определенную дату.Например, если я нажал 28 сентября, результат будет 23-28 сентября, но если я нажму 30 сентября, результат будет ТОЛЬКО 30 сентября, потому что последующие даты - октябрь.

Это мойкод для получения дат недели:

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 0, to: sunday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 6, to: sunday)
    }
}

Но для этого кода результат 30 сентября - 6 октября, что не то, что я хочу.Просьба помочь

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Я бы рекомендовал SwiftMoment , поскольку это порт Swift Moment.js .

Moment.js - это богатая библиотека, которая имеет отличную документацию и суперполезные функции для этой цели.

Учитывая date, вы можете получить start of week Date и end of week Date.

Затем оттуда вы можете перечислить даты между ними.

В настоящее время я использую Moment.js в своем проекте веб-приложения с этой функцией, чтобы получить даты недели с указанной датой:

getWeekDates (dateReference, format) {
    const startOfWeek = moment(dateReference).startOf('isoWeek');
    const endOfWeek = moment(dateReference).endOf('isoWeek');

    var days = [];
    var day = startOfWeek;

    while (day <= endOfWeek) {
        if (format !== undefined) {
          days.push(day.format(format));
        } else {
          days.push(day);
        }
        day = day.clone().add(1, 'd');
    }

    return days;
  }
0 голосов
/ 28 сентября 2018

Вы можете пересекать интервалы для недели и месяца, содержащие дату.

Вот быстрый тест:

let calendar = Calendar(identifier: .gregorian)
let date = DateComponents(calendar: calendar, year: 2018, month: 9, day: 30).date!

let weekComponents = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: date)
let startOfWeek = calendar.date(from: weekComponents)!
let endOfWeek = calendar.date(byAdding: .weekOfYear, value: 1, to: startOfWeek)!
let weekInterval = DateInterval(start: startOfWeek, end: endOfWeek)

let monthComponents = calendar.dateComponents([.year, .month], from: date)
let startOfMonth = calendar.date(from: monthComponents)!
let endOfMonth = calendar.date(byAdding: .month, value: 1, to: startOfMonth)!
let monthInterval = DateInterval(start: startOfMonth, end: endOfMonth)

let targetRange = monthInterval.intersection(with: weekInterval)!
let firstDay = targetRange.start
let lastDay = calendar.date(byAdding: .day, value: -1, to: targetRange.end)

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

0 голосов
/ 28 сентября 2018

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

var endOfWeek: Date? {
    let gregorian = Calendar(identifier: .gregorian)
    guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
    let endOfWeek = gregorian.date(byAdding: .day, value: 6, to: sunday)
    let firstOfNextMonth = gregorian.date(byAdding: .month, value: 1, to: sunday)
    let lastOfThisMonth = gregorian.date(byAdding: .day: value: -1, to: firstOfNextMonth)

    return min(endOfWeek, lastOfThisMonth)
}

Я не могу гарантировать, что этокод скомпилируется, но он должен дать вам представление о том, как выполнить то, что вы хотите.

...