Swift 4: проверка срока действия кредитной карты - PullRequest
0 голосов
/ 31 мая 2019

Я пишу код, чтобы проверить, истек ли срок действия кредитной карты.

Вот что у меня есть

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/yyyy"
let enteredDate = dateFormatter.date(from: expiryDate.text!) /* line 3 - set to first day of month */
let now = Date()
if (enteredDate! < now) {
    //expired
    // does not work if current month and year 
    // is the same as the expiration date, 
    // because expiration day is set to the first day of the month on line 3
} else {
    // valid
    print("valid - now: \(now) entered: \(enteredDate)")
}

Любые идеи о том, как я могу изменить начальную дату, чтобыпоследний день месяца вместо первого дня?

Ответы [ 5 ]

2 голосов
/ 31 мая 2019

enteredDate будет полночь по местному времени первого числа месяца истечения срока действия.Поскольку вы хотите, чтобы весь этот месяц был действительным, добавьте 1 месяц к этому значению, а затем сравните Date() с этим обновленным значением.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/yyyy"
let enteredDate = dateFormatter.date(from: expiryDate.text!)!
let endOfMonth = Calendar.current.date(byAdding: .month, value: 1, to: enteredDate)!
let now = Date()
if (endOfMonth < now) {
    print("Expired - \(enteredDate) - \(endOfMonth)")
} else {
    // valid
    print("valid - now: \(now) entered: \(enteredDate)")
}

Обратите внимание, что я оставил правильную обработку опций в качестве упражнения длячитатель.

0 голосов
/ 31 мая 2019

Вместо сравнения дат сравните месяц дат, используя сравнить (_: to: toGranularity:)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/yyyy"
if let enteredDate = dateFormatter.date(from: "05/2019") {
    let result = Calendar.current.compare(Date(), to: enteredDate, toGranularity: .month)
    if result == .orderedSame {
        print("valid")
    } else if result == .orderedAscending {
        print("valid")
    } else if result == .orderedDescending {
        print("expired")
    }
}
0 голосов
/ 31 мая 2019

rmaddy's ответ идеален. Вот как я думал об использовании Calendar для проверки. Возможно, я написал это более сложным способом.

enum ExpiryValidation {
    case valid, invalidInput, expired
}

func validateCreditCardExpiry(_ input: String) -> ExpiryValidation {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/yyyy"

    guard let enteredDate = dateFormatter.date(from: input) else {
        return .invalidInput
    }
    let calendar = Calendar.current
    let components = Set([Calendar.Component.month, Calendar.Component.year])
    let currentDateComponents = calendar.dateComponents(components, from: Date())
    let enteredDateComponents = calendar.dateComponents(components, from: enteredDate)

    guard let eMonth = enteredDateComponents.month, let eYear = enteredDateComponents.year, let cMonth = currentDateComponents.month, let cYear = currentDateComponents.year, eMonth >= cMonth, eYear >= cYear else {
        return .expired
    }
    return .valid
}

let invalidInput = validateCreditCardExpiry("hello")
let validInput = validateCreditCardExpiry("09/2020")
let expiredInput = validateCreditCardExpiry("04/2010")
0 голосов
/ 31 мая 2019
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/yyyy"
let enteredDate = dateFormatter.date(from: expiryDate.text!)

//Also convert the current date in the entered date format and then checks that the date is valid if enteredDate month or year is greater than current date. 
let currentDate = dateFormatter.date(from: dateFormatter.string(from: Date()))

if enteredDate.compare(now) != ComparisonResult.orderedAscending {
    print("Valid")   
} else {
    print("Not Valid")
}

Поскольку сравниваются только месяц и год, это решит вашу проблему с первой или последней датой месяца.

0 голосов
/ 31 мая 2019
if enteredDate.compare(now) == ComparisonResult.orderedDescending
        {
            print("valid")
        }
else{
      print("not valid")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...