Форматирование даты для следующей доступной даты в Swift

В настоящее время я загружаю списки приспособлений для спортивного приложения со стороннего веб-сайта, на котором работает лига, поэтому данные, с которыми мне приходится работать, ограничены.

Я пытаюсь реализовать функцию, которая отображает следующий предстоящий прибор. Моя проблема в том, что извлекаемые даты выглядят так:

"Сб 9 сентября 17" и "Сб 24 марта 18", например.

Я пробовал множество форматов дат в DateFormatter, о которых я знаю, и не могу найти ничего, что использует этот конкретный формат.

Если я пытаюсь использовать метод Date from string в формататоре даты с одной из приведенных выше строк, я получаю значение nil.

У меня есть множество светильников, каждый со своими датами. Мне нужно сравнить каждый из них с текущей датой, чтобы выяснить, какой будет следующий в строке.

Мое временное исправление для этого состояло в том, чтобы просто проходить по всем приборам, и как только у одного не было результата, отобразить это как следующее устройство. Очевидно, что это не работает, если в игру по какой-то причине не играли.

Как лучше всего с этим справиться?

1 ответ

По сути, вам просто нужно преобразовать текущую дату в тот же формат, что и дата, полученная с вашего стороннего веб-сайта (или наоборот), чтобы вы могли легко сравнить их:

    let currentDate = Date()

    let dateFormatter = DateFormatter()

    dateFormatter.dateFormat = "EE MMM"
    let firstPartStringDate = dateFormatter.string(from: currentDate)

    dateFormatter.dateFormat = "yy"
    let lastPartStringDate = dateFormatter.string(from: currentDate)

    let day = Calendar.current.component(.day, from: currentDate)

    let formatter = NumberFormatter()
    formatter.numberStyle = .ordinal

    guard let ordinalDay = formatter.string(for: day) else {
        return
    }

    let finalDateString = firstPartStringDate + " \(ordinalDay) " + lastPartStringDate

    print(finalDateString)

А на текущую текущую дату вы получите тот же формат, что и на стороннем веб-сайте:

Sun Sep 17th 17

ОБНОВЛЕНИЕ: Вот как вы можете преобразовать String вы переходите со стороннего сайта на Date, а затем сравнить его с текущей датой. Это решает проблему наличия st, nd, rd и th внутри String вначале.

// This is the string you get from the website    

    var webDateString = "Sat 9th Sep 17"

// First, remove the st, nd, rd or th if it exists :

    if let stSubrange = webDateString.range(of:"st") {
        webDateString.removeSubrange(stSubrange)
    } else if let ndSubrange = webDateString.range(of:"nd") {
        webDateString.removeSubrange(ndSubrange)
    } else if let rdSubrange = webDateString.range(of:"rd") {
        webDateString.removeSubrange(rdSubrange)
    }  else if let thSubrange = webDateString.range(of:"th") {
        webDateString.removeSubrange(thSubrange)
    }

// Now convert the string to a date :   

    dateFormatter.dateFormat = "EE MMM dd yy"
    guard let formattedDate = dateFormatter.date(from: finalDateString) else {
        return
     }

// You can now compare formattedDate and the current date easily like so :

    let currentDate = Date()

    if formattedDate < currentDate {

        // Do something interesting here :)

    } else {

        // Do something else!
    }
Другие вопросы по тегам