L oop через дни / недели / месяцы / годы с даты (быстрой) - PullRequest
0 голосов
/ 01 мая 2020

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

Я хотел бы создать таблицу, в которой будут отображаться эти ограничения: сгруппированные , с даты, когда пользователь добавил лимит ', до текущей даты

Сегодня 2020 год 1


Пример

Пользователь добавляет «Недельный лимит» в 2020 апреля 15

Тогда я бы хотел отобразить следующие ячейки:

  • 2020 13 апреля - 2020 апреля 19 (первая неделя)

  • 2020 апреля 20 - 2020 апреля 26 ( вторая неделя)

  • 2020 27 апреля - 2020 май 3 (третья неделя)


Пример 2

Пользователь добавляет «Ежемесячный лимит» на 2020 января 10

Затем я хотел бы отобразить следующие ячейки:

  • январь (первый месяц)
  • Febr uary (второй месяц)
  • март (третий месяц)
  • апрель (четвертый месяц)
  • май (пятый месяц)

И то же самое с ежедневным / годовые лимиты.

Как мне этого достичь?

class Spare {
    static let shared = Spare()

    var limits : [Limit] = [] // Here do I store the limits

    func tableGenerateLimits() -> [Limit] {
        // ???
    }
}
class Limit : NSObject {

    var id : Double
    var date : Date
    var value : Int

    var type : LimitType = .weekly

    init(id : Double? = nil, date : Date, value: Int, type : LimitType){
        self.id = id ?? NSDate().timeIntervalSince1970
        self.date = date
        self.value = value
        self.type = type

        super.init()
    }
}

Я полностью потерян

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Вы должны прочитать о DateComponents и классе Calendar.

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

let calendar = Calendar.current

var weekday = calendar.dateComponents([.weekday], from: today)
var diff = weekday.weekday! - calendar.firstWeekday
if diff < 0 { diff += 7}
let startDate = calendar.date(byAdding: .day, value: -diff, to: today)
let endDate = calendar.date(byAdding: .day, value: 6, to: startDate!)!

Затем вы можете получить больше дат начала и окончания, используя ту же функцию Calendar, чтобы добавить, но используйте .week вместо. Что-то вроде

let nextStart = calendar.date(byAdding: .week, value: 1, to: startDate)

, но, возможно, в oop.

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

let month = calendar.dateComponents([.month], from: today).month!

И затем вы можете использовать массив названий месяцев, используя monthSymbols, чтобы получить пять месяцев

for i in month..<(month + 5) {
    let index = i > 12 ? i - 13 : i - 1
    print(calendar.monthSymbols[index])
}
0 голосов
/ 01 мая 2020

Сначала вы можете создать объект Date(), а затем использовать объект Calendar, чтобы получить значения, необходимые для всех этих вычислений.

let date = Date()
let calendar = Calendar.current
var year = 0
var month = 0
var day = 0

Затем вы можете получить спецификацию c дату, чтобы возвратиться, делая что-то вроде этого.

let toDate = Calendar.current.date(byAdding: .day, value: someDayFutureOrPast, to date)

Как только у вас есть указанная c дата, сохраненная как переменная, вы можете просто извлечь ее из calendar следующим образом.

let year = calendar.component(.year, from: toDate!)
let month = calendar.component(.month, from: toDate!)
let day = calendar.component(.day, from: toDate!)

Поскольку вы работаете с ячейками, вам нужно разместить метод для получения этого из вашего tableView(cellForRowAt...) метода где-нибудь или где бы он ни работал.

Вот метод, который будет получить именно то, что вы хотите. Ради простоты я вернул кортеж, но вы можете преобразовать его так, как вам нужно. Извиняюсь за любые синтаксические ошибки. Я не на моей маме c и не рядом со мной.

func getDate(dateFromCurrent: Int) -> (Int, Int, Int) {
    let date = Date()
    let calendar = Calendar.current
    var year = 0
    var month = 0
    var day = 0
    let toDate = Calendar.current.date(byAdding: .day, value: someDayFutureOrPast, to date)

return (calendar.component(.year, from: toDate!), 
        calendar.component(.month, from: toDate!),
        calendar.component(.day, from: toDate!)
}

ПРИМЕЧАНИЕ Вы можете go BACK IN TIME, изменив someDayFutureOrPast на отрицательный int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...