Сравнение даты со строковым значением даты Swift

#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