Swfit- проверяет, находится ли текущее время между двумя временными строками

#ios #swift

#iOS #swift

Вопрос:

Как проверить, находится ли текущее время между двумя временными строками в следующем формате. HH:MM AM/PM скажите, если

 startTime = "10:30 AM" 
endTime = "06:30 PM"
  

как проверить, находится ли currentTime() значение между временем начала и окончания?

Комментарии:

1. Вы устали получать временную метку Unix, эквивалентную дате времени, а затем сравнивать все три значения. Отметка времени не должна быть ниже времени начала и выше времени окончания

2. Я получаю начальную и конечную дату из API, поэтому временная метка Unix невозможна

3. Затем вы можете просто использовать обычную функцию swift для сравнения временных меток…. Я приведу пример

Ответ №1:

Вы можете установить средство форматирования даты defaultDate на сегодня, проанализировать строки даты, создать a DateInterval с начальной и конечной датой и проверить, содержит ли оно now Date() :

 extension Formatter {
    static let today: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = .init(identifier: "en_US_POSIX")
        dateFormatter.defaultDate = Calendar.current.startOfDay(for: Date())
        dateFormatter.dateFormat = "hh:mm a"
        return dateFormatter
        
    }()
}
  

 func checkIfCurrentTimeIsBetween(startTime: String, endTime: String) -> Bool {
    guard let start = Formatter.today.date(from: startTime),
          let end = Formatter.today.date(from: endTime) else {
        return false
    }
    return DateInterval(start: start, end: end).contains(Date())
}
  

 let startTime = "10:30 AM"
let endTime = "06:30 PM"
checkIfCurrentTimeIsBetween(startTime: startTime, endTime: endTime)   // true
  

Комментарии:

1. Мне нравится трюк today форматера, который по умолчанию использует время текущего дня. Однако использование DateInterval для проверки, находится ли текущее время между временем начала и окончания, кажется немного глупым. Для последних нескольких выпусков ОС объекты Date были сопоставимы, поэтому вы могли бы просто сказать if now >= start amp;amp; now <= end

2. @DuncanC Мне нравится удобство чтения. Я мог бы также использовать диапазон дат и оператор сопоставления с образцом и return start..<end ~= Date() , но OP кажется довольно новым для Swift

3. Я лично ненавижу оператор сопоставления с шаблоном в том, что касается удобочитаемости (или, скорее, отсутствия удобочитаемости).)

Ответ №2:

Вы можете использовать Swift Dateformatter() для кодирования и сравнения дат:

 let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
dateFormatter.locale = Locale.init(identifier: "en_GB")
dateFormatter.defaultDate = Calendar.current.startOfDay(for: Date())
dateFormatter.amSymbol = "AM"
dateFormatter.pmSymbol = "PM"

let startTimeFormatted = dateFormatter.today.date(from: startTime)
let endTimeFormatted = dateFormatter.today.date(from: endTime)

//Now you can compare the two, e.g.

if startTimeFormatted > currentDate() amp;amp; currentDate() < endTimeFormatted{
    return true
}
  

Комментарии:

1. В вашем коде есть несколько проблем. это должно быть hh вместо h . Вы должны использовать языковой стандарт «en_US_POSIX». И результирующие даты будут 1 января 2000 года, а не сегодня.

2. today Свойство экземпляра не включено DateFormatter . dateFormatter.today неверно. Просто используйте обычный dateFormatter.whatever . Вы все еще используете неправильную локаль. Вы всегда должны пытаться скомпилировать свой код перед отправкой ответа.

3. И я забыл упомянуть, что вы должны установить локаль, ПРЕЖДЕ чем устанавливать dateFormat свойство.