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

Я пытаюсь проверить, существует ли конкретный день в месяце или нет. Однако не смог найти ничего полезного. Чтобы привести пример, я попробовал код ниже в 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"

Итак, что он делает, так это пытается манипулировать часовыми поясами и перемещает стрелку. Следовательно, я не могу найти способ проверить, существует ли конкретный день в данном месяце и году. Может ли кто-нибудь направить.


person Rameswar Prasad    schedule 17.07.2017    source источник


Ответы (4)


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

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

print(components.isValidDate) // false
person Martin R    schedule 17.07.2017
comment
Спасибо за ответ, но у меня тут вопрос. Components.date объявлен как необязательный, но почему он смещает дату, а не возвращает nil. - person Rameswar Prasad; 17.07.2017
comment
@RameswarPrasad: components.date равно нулю, если components.calendar не установлено. Я не знаю, есть ли другие случаи, когда он возвращает ноль. Обычно он оборачивает, чтобы получить действительную дату. DateFormatter имеет свойство as isLenient для управления этим поведением, но DateComponents не имеет такого свойства. - person Martin R; 17.07.2017

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

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

Тогда ваша проблема сводится к проверке того, находится ли данный день в диапазоне [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

person vishwarajanand    schedule 17.07.2017

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

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
person Dharma    schedule 17.07.2017

Вы можете проверить, используя 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")
}

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

person Ravi    schedule 17.07.2017