Сравнение времени

swift

#1

Добрый вечер! Вопрос школьного характера, но я в замешательстве.
Задание: есть массив времени его содержимое нужно сравнить с текущим временем, если время в массиве >= текущему времени то записываем , если меньше то пропускаем. когда массив будет пуст то выводим сообщение. Сделал, но похоже на ерунду

let timeArray = ["11:05", "13:20", "15:35", "17:50", "20:05", "22:25"]

var freeArray = [String]()
timeArray.forEach {(arr) in
if arr >= "23:25" {
    freeArray.append(arr)
    if freeArray.isEmpty == false {
    print(freeArray)
    }
  }
}
if freeArray.isEmpty {
print("На сегодня записи нет!.")
}

#2

Направьте плиз в нужное русло)


#3
struct Time {
    let hour, minute: Int
}

extension Time: ExpressibleByStringLiteral {
    init(stringLiteral value: String) {
        let components = value.components(separatedBy: ":").map { Int($0)! }
        hour = components[0]
        minute = components[1]
    }
}

extension Time: Comparable {
    static func < (lhs: Time, rhs: Time) -> Bool {
        return lhs.hour < rhs.hour || lhs.hour == rhs.hour && lhs.minute < rhs.minute
    }
}

let timeArray: [Time] = ["11:05", "13:20", "15:35", "17:50", "20:05", "22:25"]

let freeArray = timeArray.filter { $0 >= "23:25" }

print(freeArray)

#4

haymob
Спасибо! за отклик , но мне не нужно дербанить время от минут. сравнивается текущее время со временем в массиве т.е 11:05 >= 10:05 записываем в UILabel , а если в массиве время меньше текущего как в моем примере то сообщаем print(“На сегодня записи нет!.”) Нужно вот так чтобы было
1 Когда текущее время меньше времени массива

2 текущее время больше времени в массиве

Мне не нравится исполнение кода!


#5

Сравнивать строки как время не очень хорошая идея.

"9:21" > "12:21" // true

#6

haymob
Спасибо!
Согласен я сначала все переводил в секунды, но тот вариант мне тоже не понравился


#7

а как вы хотите сравнивать время, что бы вам такой вариант понравился?


#8

Меня бы устроило как бы решил Профессионал, какими вы тут и являетесь !


#9

время сравнивается либо в секундах, либо timestamp, других вариантов нет.


#10

такое тоже имеется я перевожу в 24 часовой формат. Затем перевожу в секунды и сравниваю. Все в одном методе для тестирования.

 fileprivate func generalHallTime(_ hallId: Halls, _ responds: Schedule) {
     var timeSession = TimeSession()
     let timeFilm = TimeFilm()
    
     responds.schedule.forEach { (timeHall) in
        timeSession.is_open = timeHall.sale.is_open
     timeSession.formats = timeHall.formats
     timeSession.price_max = timeHall.sale.price_max
     timeSession.upgrades = timeHall.upgrades
        
     if self.anonceMenuFilms?.id == timeHall.film_id {
        if timeHall.hall_id == hallId.id {
         let timeN = timeHall.timestamp
         let date = NSDate(timeIntervalSince1970: TimeInterval(timeN))
         let currentTime = timeFilms(currentDate)
         let time = timeFilms((date as NSDate) as Date)
         let filmTime = timeFilm.timeHallFilm(timeHall.timestamp, dateFormat: "HH:mm")
            
     if currentTime <= time {
         timeSession.time = String(filmTime)
         timeSession.hall = hallId.title
         self.session.append(timeSession)
     }
 }
 DispatchQueue.main.async {
    self.collectionView.reloadData()
            }
        }
    }
 }

Результат:
Optional(“16:55”)
Optional(“14:40”)
Optional(“19:20”)
Optional(“21:25”)
Optional(“22:00”)
Optional(“13:40”)
Optional(“16:00”)
Optional(“18:20”)
Optional(“20:40”)
Optional(“23:00”)

Задача дополнить, чтобы когда текущее время будет больше Optional(“23:00”) Вывести сообщение "На сегодня записи нет! " Способом выше пытался это реализовать, но понимаю, что бредово)))


#11

Это Clean Architecture :slight_smile:

CamelCase и snake_case в одной строке тоже шедевр.

P.S. Извините не смог мимо пройти :slight_smile:


#12

Еще один вариант, скажем так совсем в лоб
Исходя из того, что время, это увеличивающаяся величина, то строку можно смело конвертировать в Int, аналогично как с датой в формате yyyy-mm-dd.

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)
let currTime = Int("\(hour)\(minutes)")!

var freeArray = timeArray.filter { Int($0.replace(":", "")) >= currTime }
if freeArray.isEmpty {
    print("На сегодня записи нет!.")
}

P.S. естественно это с учетом времени в формате 24h


#13

Знаю, что “шедеврально” ) эт все поправимо). Прошу за это не пинать


#14

Вот так у меня реализован метод timeFilms

func timeFilms(_ date: Date) -> Int {
     let calendar = Calendar.current
     let hour = calendar.component(.hour, from: date)
     let min = calendar.component(.minute, from: date)
     let time = (hour * 3600) + (min * 60)
    
     return time
 }

#15

Ошибку выдает тут

Binary operator '>=' cannot be applied to operands of type '_' and 'Int'
var freeArray = timeArray.filter { Int($0.replace(":", "")) >= currTime }

#16

var freeArray = timeArray.filter { Int($0.replacingOccurrences(of: ":", with: ""))! >= currTime }


#17

Так как же все таки грамотней сделать?


#18

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


#19

Спасибо так и подумал!


#20

Вживил в свой код, для проверки, но не совсем то, что нужно

 fileprivate func generalHallTime(_ hallId: Halls, _ responds: Schedule) {
    responds.schedule.forEach { (timeHall) in
        if self.anonceMenuFilms?.id == timeHall.filmId {
            if timeHall.hallId == hallId.id {

               let filmTime = formattedTimeSession(timeHall)
                    
               var timeArray = [String]()
               timeArray.append(filmTime)
                
               let date = Date()
               let calendar = Calendar.current
               let hour = calendar.component(.hour, from: date)
               let minutes = calendar.component(.minute, from: date)
               let currTime = Int("\(hour)\(minutes)")!

               let freeArray = timeArray.filter { Int($0.replacingOccurrences(of: ":", with: ""))! >= currTime }
                    
               if freeArray.count > 0 {
                    print(freeArray)
               }
               if freeArray.isEmpty {
                  print("На сегодня записи нет!.")
                }
        }
        DispatchQueue.main.async {
            self.collectionView.reloadData()
            }
        }
    }
 }

результат
На сегодня записи нет!.
На сегодня записи нет!.
На сегодня записи нет!.
[“19:50”]
[“22:15”]
Эта запись На сегодня записи нет!. нужна только когда массив будет пуст. Когда текущее время будет больше 22:15 Тогда и выводим На сегодня записи нет!.