#ios #swift #datepicker
#iOS #swift #выбор даты
Вопрос:
Я пытаюсь преобразовать строковую дату в тип даты. Но когда я пытаюсь использовать этот приведенный ниже код, возвращающий нулевое значение после сравнения двух дат друг с другом, одна из них выбирается из средства выбора даты, а вторая — текущая дата, но всегда указываю номер возврата.
Я действительно не понимаю, как преобразовать строковую дату в тип даты и после сравнения двух дат друг с другом, пожалуйста, проверьте код ниже:
Код
let currentDate = Date()
let currentDformatter = DateFormatter()
currentDformatter.dateFormat = "dd-MM-yyyy"
let currentDateResult = currentDformatter.date(from: "(currentDate)")
print("Current Latest Date ",currentDateResult as Any)
let selectedDate = Date()
let selectedDformatter = DateFormatter()
selectedDformatter.dateFormat = "dd-MM-yyyy"
let selectedresult = selectedDformatter.string(from: selectedDate)
print("Current Latest Date ",selectedresult)
if currentDateResult == selectedDate{
print("yes")
}else{
print("no")
}
И я также сравниваю время, пожалуйста, дайте мне совет о том, как я могу запретить пользователю выбирать время в сборщике времени по истечении определенного времени. Например, время закрытия ресторана составляет 5 часов.
Код:
CurrentDateAndTime 2019-04-15 05:00:00 0000
SelectDateAndTime 2019-04-16 07:52:28 0000
Я не хочу, чтобы пользователь выбирал время после 5’o часов, как я могу проверить и сравнить время??
как я могу проверить и сравнить время??
Комментарии:
1. вы уверены, что строка, которую вы пытаетесь преобразовать, находится в этом формате «дд-ММ-гггг» ?
2. Выбранная дата из средства выбора даты также является a
Date
, а не строкой, так почему бы вам просто не сравнить эти дваDate
типа?
Ответ №1:
Есть лучший способ проверить, совпадают ли две даты в один и тот же день
let currentDate = Date()
let selectedDate = Date()
if Calendar.current.isDate(currentDate, inSameDayAs: selectedDate) {
print("yes")
} else {
print("no")
}
Комментарии:
1. и я также сравниваю время, пожалуйста, дайте мне совет о том, как я могу запретить пользователю выбирать время в сборщике времени по истечении определенного времени. Например, например, время закрытия ресторана составляет 5 часов, и я не хочу, чтобы пользователь выбирал время после 5 часов, как я могу проверить и сравнить время??
2. Вы могли бы сравнить часовой компонент:
let hour = Calendar.current.component(.hour, from: Date()) > 17
3. Вы пробовали предложение в моем последнем комментарии? Или установите минимальную и максимальную дату средства выбора даты.
4. 17 для вечера и 5 для утра. При этом проверяется, находится ли выбранная дата после 5 часов.
5. @ShamDass Вы хотите запретить пользователям выбирать после 5 вечера каждый день?
Ответ №2:
let currentDate = Date()
let currentDformatter = DateFormatter()
currentDformatter.dateFormat = "dd-MM-yyyy"
let currentDateResult = currentDformatter.date(from: "(currentDate)")
print("Current Latest Date ",currentDateResult as Any)
В приведенном выше коде вы фактически не преобразуете объект Date в строковый тип. При интерполяции в строку будет распечатан только объект и его свойства. Вы должны преобразовать свой объект date в строку.
let myDateInString = "22-08-2018"
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "dd-MM-yyyy"
let date = formatter.date(from: myDateInString) // Optional
let stringVal = formatter.string(from: date!)
debugPrint(stringVal)
Если вы хотите сравнить две даты, вы можете использовать:
switch date1.compare(date2) {
case .orderedSame: break // exact same
case .orderedAscending: break // date2 comes after date1 in calendar
case .orderedDescending: break // date2 comes before date1 in calendar
}
Если вы просто хотите проверить, относятся ли две даты к одному и тому же дню, используйте ответ @vadian
Ответ №3:
Вы получаете currentDateResult
это nil
потому, что вы неправильно передаете date String
, поэтому вам нужно преобразовать date
в, а string
затем передать string
в это, как показано ниже:
let currentDateResult = currentDformatter.date(from: currentDformatter.string(from: currentDate))
В противном случае вы можете сделать то же самое, что и в приведенном выше ответе @vadian