How do I find the number of days in given month and year using swift
I want to find the total number days on given month and year. Example: I want to find total number of days on year = 2015, month = 7
Solution 1:
First create an NSDate
for the given year and month:
let dateComponents = NSDateComponents()
dateComponents.year = 2015
dateComponents.month = 7
let calendar = NSCalendar.currentCalendar()
let date = calendar.dateFromComponents(dateComponents)!
Then use the rangeOfUnit()
method, as described in
Number of days in the current month using iPhone SDK?:
// Swift 2:
let range = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: date)
// Swift 1.2:
let range = calendar.rangeOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitMonth, forDate: date)
let numDays = range.length
print(numDays) // 31
Update for Swift 3 (Xcode 8):
let dateComponents = DateComponents(year: 2015, month: 7)
let calendar = Calendar.current
let date = calendar.date(from: dateComponents)!
let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count
print(numDays) // 31
Solution 2:
Updated for Swift 3.1, Xcode 8+, iOS 10+
let calendar = Calendar.current
let date = Date()
// Calculate start and end of the current year (or month with `.month`):
let interval = calendar.dateInterval(of: .year, for: date)! //change year it will no of days in a year , change it to month it will give no of days in a current month
// Compute difference in days:
let days = calendar.dateComponents([.day], from: interval.start, to: interval.end).day!
print(days)
Solution 3:
In extension format, using self
to be able to return the number of days more dynamically (Swift 3).
extension Date {
func getDaysInMonth() -> Int{
let calendar = Calendar.current
let dateComponents = DateComponents(year: calendar.component(.year, from: self), month: calendar.component(.month, from: self))
let date = calendar.date(from: dateComponents)!
let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count
return numDays
}
}
Solution 4:
Swift 5.0
func getDaysInMonth(month: Int, year: Int) -> Int? {
let calendar = Calendar.current
var startComps = DateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year
var endComps = DateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year
let startDate = calendar.date(from: startComps)!
let endDate = calendar.date(from:endComps)!
let diff = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)
return diff.day
}
if let numberOfDays = getDaysInMonth(month: 1, year: 2015) {
print(numberOfDays)
}
Swift 2.0
func getDaysInMonth(month: Int, year: Int) -> Int
{
let calendar = NSCalendar.currentCalendar()
let startComps = NSDateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year
let endComps = NSDateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year
let startDate = calendar.dateFromComponents(startComps)!
let endDate = calendar.dateFromComponents(endComps)!
let diff = calendar.components(NSCalendarUnit.Day, fromDate: startDate, toDate: endDate, options: NSCalendarOptions.MatchFirst)
return diff.day
}
let days = getDaysInMonth(4, year: 2015) // April 2015 has 30 days
print(days) // Prints 30
Swift 1.2
func getDaysInMonth(month: Int, year: Int) -> Int
{
let calendar = NSCalendar.currentCalendar()
let startComps = NSDateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year
let endComps = NSDateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year
let startDate = calendar.dateFromComponents(startComps)!
let endDate = calendar.dateFromComponents(endComps)!
let diff = calendar.components(NSCalendarUnit.CalendarUnitDay, fromDate: startDate, toDate: endDate, options: NSCalendarOptions.allZeros)
return diff.day
}
let days = getDaysInMonth(4, 2015) // There were 30 days in April 2015
println(days) // Prints 30