#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 кажется довольно новым для Swift3. Я лично ненавижу оператор сопоставления с шаблоном в том, что касается удобочитаемости (или, скорее, отсутствия удобочитаемости).)
Ответ №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
свойство.