Учитывая год и месяц, как проверить, что определенный день существует в этом месяце


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

var components = DateComponents()
components.month = 2
components.year = 2016
components.day = 30
components.calendar = Calendar.current

components.date

Это дает ответ;

"Mar 1, 2016, 12:00 AM"
Таким образом, он пытается манипулировать временными поясами и двигает стрелку. Поэтому я не могу найти способ проверить, существует ли конкретный день в данном месяце и Году. Может кто-нибудь, пожалуйста, проводник.
4 2

4 ответа:

DateComponents имеет свойство isValidDate, которое можно использовать для этой цели:

var components = DateComponents()
components.month = 2
components.year = 2016
components.day = 30
components.calendar = Calendar.current

print(components.isValidDate) // false

Давайте разберем это на -

Как проверить количество дней в месяце-году?

Тогда ваша задача сводится к проверке, находится ли данный день в диапазоне [1, numDaysInMonthYear).

Код для вышеизложенного таков:

// Swift 2:
let range = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: date)
// Swift 1.2:
let range = calendar.rangeOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitMonth, forDate: date)

let numDaysInMonthYear = range.length
print(numDaysInMonthYear) // 31

Кредиты: Как найти количество дней в данном месяце и году с помощью swift

Попробуйте этот метод ниже, вы можете проверить, существует ли конкретный день в месяце.

function checkDayIsExist(year:Int,month:Int,day:Int) -> Bool {

   let dateComponents = DateComponents(year: year, month: month)
   let calendar = Calendar.current
   let date = calendar.date(from: dateComponents)!

   let numberOfDays = calendar.range(of: .day, in: .month, for: date)!
   return numberOfDays.count >= day
}

Вызов по

print(checkDayIsExist(year:2017,month:7,day:31)) // true

Вы можете проверить, используя NSDateFormatter / DateFormatter

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

let dateString = "30 02 2017"

if let date = dateFormatter.date(from: dateString)
{
  print("Date \(date)")   
}
else
{
  print("Date not existed")
}

Вы можете изменить форматирование даты на основе входной строки.