30-минутные инкременты времени не работают в Swift - PullRequest
0 голосов
/ 11 апреля 2020

У меня проблемы с получением моего кода для работы. Я пытаюсь создать 30-минутные слоты в Swift, но кажется, что время от времени происходит случайный скачок часа. См. Код ниже:

                    let calendar = Calendar.current
                    var hour = 07
                    var hour2 = 07
                    var minute = 0
                    var timeLoop = 1

                    var startDate = calendar.date(bySettingHour: hour, minute: 0, second: 0, of: editedDate)
                    var endDate = calendar.date(bySettingHour: hour2, minute: 0, second: 0, of: editedDate)


                    repeat {

                        if(timeLoop % 2 == 0){
                            startDate = calendar.date(bySettingHour: hour2, minute: 30, second: 0, of: editedDate)
                            endDate = calendar.date(bySettingHour: hour, minute: 0, second: 0, of: editedDate)
                        }
                        else {
                            startDate = calendar.date(bySettingHour: hour2, minute: 0, second: 0, of: editedDate)
                            endDate = calendar.date(bySettingHour: hour2, minute: 30, second: 0, of: editedDate)
                        }

                        if (timeLoop == 1) {
                            startDate = calendar.date(bySettingHour: hour, minute: 0, second: 0, of: editedDate)
                            endDate = calendar.date(bySettingHour: hour, minute: 30, second: 0, of: editedDate)
                        }


                        let eventDate = EventDate()
                        eventDate.startDate = startDate!
                        eventDate.endDate = endDate!
                        self.suggestedDates.append(eventDate)
                        self.suggestedDates.sort(by: {$0.startDate < $1.startDate}) //Recheck this

                        //Only need to add this once for day purposes
                        if (hour == 07) {
                            self.allDayDates.append(eventDate)
                            self.allDayDates.sort(by: {$0.startDate < $1.startDate}) //Recheck this
                        }

                            //update hours
                            hour2 = hour
                            hour += 1
                            timeLoop += 1


                    } while hour <= 21

Это дает следующие результаты 07:00 - 07:30, 07:30 - 08:00, 08:00 - 08:30, 09:30 - 10:00, 10:00 - 10:30, 11:30 - 12:00, 12:00 - 12:30, 13:30 - 14: 00,

Как вы можете видеть, прыжок с 10:30 до 11: 30.

1 Ответ

1 голос
/ 11 апреля 2020

Ваш код не дает достаточного представления о том, что вы пытаетесь сделать.

Однако, чтобы получить временные интервалы, вы можете сделать что-то вроде этого:

let calendar = Calendar.current
let startHour = 07 // Hour from where you want to start the slots
var hourCounter = 07 // Hour counter for looping
let slotDuration = 30 // Constant for duration of slots

let editedDate = Date() // The selected date, as per your code

// Create the start date by setting hour value to the `startHour` of `editedDate`
var startDate = calendar.date(bySettingHour: startHour, minute: 0, second: 0, of: editedDate)
// Assign the same value to endDate as the initial value
var endDate = startDate

repeat {

    // Assign the end date to the start date,
    // This will get you the slot start duration from earlier slot's end date
    // For example,
    // If this is the starting slot,
    // then the startDate and endDate will be same, as per above code.
    // If this is any subsequent slot,
    // then the slot should start from the last slot's endDate.
    // i.e. if previous slot was 01:30 - 2:00,
    // then current slot should start from 2:00.
    startDate = endDate

    if let date = startDate {
        // Get the new endDate by adding your slot duration to the startDate
        endDate = calendar.date(byAdding: .minute, value: slotDuration, to: date)
    }

    // ...
    // Do whatever you want to do with these slot values here...
    // ...

    // Increment the counter for looping
    hourCounter += 1

} while hourCounter <= 21

Код генерирует время слоты на основе длительности слота. Вы можете изменить slotDuration на любое желаемое значение (в минутах), и оно будет генерировать соответствующие слоты. Попробуйте изменить его с 30 на 15 и посмотрите результаты.

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