BTUIKCardExpirationValidator.m 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #import "BTUIKCardExpirationValidator.h"
  2. #ifdef __IPHONE_8_0
  3. #define kBTNSGregorianCalendarIdentifier NSCalendarIdentifierGregorian
  4. #else
  5. #define kBTNSGregorianCalendarIdentifier NSGregorianCalendar
  6. #endif
  7. @implementation BTUIKCardExpirationValidator
  8. + (BOOL)month:(NSUInteger)month year:(NSUInteger)year validForDate:(NSDate *)date {
  9. // Creating NSCalendar is expensive, so cache it!
  10. static NSCalendar *gregorianCalendar;
  11. if (!gregorianCalendar) {
  12. gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:kBTNSGregorianCalendarIdentifier];
  13. }
  14. NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
  15. dateComponents.calendar = gregorianCalendar;
  16. dateComponents.year = ((year % 2000) + 2000) ;
  17. dateComponents.month = month;
  18. NSInteger newMonth = (dateComponents.month + 1);
  19. if (newMonth > 12) {
  20. dateComponents.month = newMonth % 12;
  21. dateComponents.year += 1;
  22. } else {
  23. dateComponents.month = newMonth;
  24. }
  25. BOOL expired = [date compare:dateComponents.date] != NSOrderedAscending;
  26. if (expired) {
  27. return NO;
  28. }
  29. NSDate *farFuture = [date dateByAddingTimeInterval:3600 * 24 * 365.25 * kBTUIKCardExpirationValidatorFarFutureYears]; // roughly years in the future
  30. BOOL tooFarInTheFuture = [farFuture compare:dateComponents.date] != NSOrderedDescending;
  31. return !tooFarInTheFuture;
  32. }
  33. @end