компоненты даты не совпадают с ожидаемыми при заполнении таблицы Swift 4 - PullRequest
0 голосов
/ 08 февраля 2019

Я изо всех сил пытаюсь понять, почему при чтении из добавлений даты .day и .weekday не соответствуют ожидаемым.В одной функции dates() я получаю фактическую дату, получаю первый день месяца, получаю диапазон дней для месяца, и в цикле я добавляю все даты этого месяца к datesArray.при печати массив корректен, начинается с даты 1 и заканчивается датой 28 (текущий месяц).Затем в cellForRowAt в CalendarTableViewController я назначаю дату для строки.Получить компоненты с даты.Затем я сочиняю cellLabel.text с components.day + dayNamesArray[components.weekday].Результаты неверны: ячейки выключены на один день, начиная со дня 2 (вместо 1) и заканчивая днем ​​1 (вместо 28), так как название дня неверно.Где проверить, что компенсирует результаты?Большое спасибо, как обычно.

Вот две функции:

func dates() {
        datesArray.removeAll()

        // Set calendar and date
        let calendar = Calendar.current
        let date = Date()

        // Get range of days in month
        let range = calendar.range(of: .day, in: .month, for: date)! // Range(1..<32)

        // Get first day of month
        var firstDayComponents = calendar.dateComponents([.year, .month, .day, .weekday], from: date)
        self.displayedMonth = firstDayComponents.month!
        self.monthCounter = self.displayedMonth - 1
        firstDayComponents.day = range.lowerBound
        let firstDay = calendar.date(from: firstDayComponents)!
        var dayToAppend: Date = calendar.date(byAdding: DateComponents(day: 1), to: firstDay)!
        for date in 1...range.count {

            datesArray.append(dayToAppend)
            dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
        }

        self.actualMonthLabel.text = self.monthsArray[self.monthCounter]
        print("dateArray is: \(datesArray)") // array is correct

    }

и в TableView:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "calendarCell", for: indexPath) as!CalendarTableViewCell

        // Configure the cell...

        let date = datesArray[indexPath.row]
        print(date)

        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date)
        print("month is: \(String(describing: components.month))")     // correct
        print("day is: \(String(describing: components.day))")         // +1
        print("weekdayIs: \(String(describing: components.weekday))")  // +1
        cell.dayLabel.text = "\(String(describing: components.day!))" + " " + "\(dayNamesArray[components.weekday! - 1])"
        if indexPath.row == self.actualDay - 1 && self.actualMonth == self.displayedMonth {
            cell.dayLabel.backgroundColor = UIColor.red.withAlphaComponent(0.3)
        }

        return cell
    }

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Попробуйте установить часовой пояс календаря как UTC и попробуйте тоже самое.Надеюсь, это сработает для вас.

0 голосов
/ 08 февраля 2019

Посмотрите внимательно на отмеченные строки вашего кода:

let firstDay = calendar.date(from: firstDayComponents)!
var dayToAppend: Date = calendar.date(byAdding: DateComponents(day: 1), to: firstDay)! // <<--!!!
for date in 1...range.count {
    datesArray.append(dayToAppend) // <--!!!
    dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
}

Сначала вы получите firstDay месяца.Затем вы добавляете 1 день (таким образом, dayToAppend - 2-е число месяца), а затем вы добавляете dayToAppend к вашему массиву.Итак, ваш массив начинается со второго дня месяца. Не с первым.Таким образом, решение будет таким:

let firstDay = calendar.date(from: firstDayComponents)!
var dayToAppend: Date = firstDay // <-- only line changed
for date in 1...range.count {
    datesArray.append(dayToAppend)
    dayToAppend = calendar.date(byAdding: DateComponents(day: 1), to: dayToAppend)!
}

Причина, по которой вы думали, что все хорошо: вы, вероятно, не учитываете часовые пояса.Например, когда я распечатываю объект даты на 1 февраля, он выглядит так: 2019-01-31 23:00:00 +0000.Я живу в GMT + 1.Объект Date сообщает 23:00 по Гринвичу.Это означает, что сейчас 24:00 / 00:00 по Гринвичу + 1.Это на следующий день .

Всегда внимательно читайте напечатанные объекты Date.:)

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