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
Asked
Active
Viewed 4.8k times
8 Answers
131
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
-
This is definitely a lot cleaner than mine. – mbottone Jul 23 '15 at 16:13
-
Hi Martin can please look into this http://stackoverflow.com/questions/31595260/how-to-scroll-the-entire-section-horizontally-in-collectionview-swift – Shrestha Ashesh Jul 24 '15 at 05:46
-
@ShresthaAshesh: I don't think that I can help you with that one, sorry. – Martin R Jul 24 '15 at 06:57
-
and what if we have to get all the dates of month – shubh14896 Apr 14 '18 at 04:35
-
@MartinR may you please tell that can we get day only from month if year is not given ? – AbecedarioPoint Jul 17 '18 at 09:21
19
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)

אורי orihpt
- 2,358
- 2
- 16
- 41

Abdul Karim
- 4,359
- 1
- 40
- 55
16
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
}
}

spogebob92
- 1,474
- 4
- 23
- 32
3
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
-
Its working on swift 1.2, but shows error in swift 2.0 (Xcode 7) on NScalendarUnit.CalendarUnitDay. – Shrestha Ashesh Jul 23 '15 at 14:58
-
You should add that kind of information to your question in the future. – mbottone Jul 23 '15 at 15:01
-
http://stackoverflow.com/questions/30798561/xcode-7-beta-differences-in-nsdatecomponents/30798673#30798673 – Eric Aya Jul 23 '15 at 15:03
-
3
In order to get number of days and all the dates on given month and year, try this.
func getAllDates(month: Int, year: Int) -> [Date] {
let dateComponents = DateComponents(year: year, month: month)
let calendar = Calendar.current
let date = calendar.date(from: dateComponents)!
let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count
let formatter = DateFormatter()
formatter.dateFormat = "yyyy MM dd"
formatter.timeZone = TimeZone(abbreviation: "GMT+0:00")
var arrDates = [Date]()
for day in 1...numDays {
let dateString = "\(year) \(month) \(day)"
if let date = formatter.date(from: dateString) {
arrDates.append(date)
}
}
return arrDates
}
Usage:
let arrDatesInGivenMonthYear = getAllDates(month: 1, year: 2018)
debugPrint(arrDatesInGivenMonthYear)
//Output: [2018-01-01 00:00:00 +0000, 2018-01-02 00:00:00 +0000, ... , 2018-01-31 00:00:00 +0000]
let numberOfDays = arrDatesInGivenMonthYear.count
debugPrint(numberOfDays)
//Output: 31

Mohammad Zaid Pathan
- 16,304
- 7
- 99
- 130
3
Swift 5
Another way to approach this:
extension Date {
func daysInMonth(_ monthNumber: Int? = nil, _ year: Int? = nil) -> Int {
var dateComponents = DateComponents()
dateComponents.year = year ?? Calendar.current.component(.year, from: self)
dateComponents.month = monthNumber ?? Calendar.current.component(.month, from: self)
if
let d = Calendar.current.date(from: dateComponents),
let interval = Calendar.current.dateInterval(of: .month, for: d),
let days = Calendar.current.dateComponents([.day], from: interval.start, to: interval.end).day
{ return days } else { return -1 }
}
}
1
here is the swift 4.0 version
func getTotalDate(){
// choose the month and year you want to look
var dateComponents = DateComponents()
dateComponents.year = 2018
dateComponents.month = 10
let calendar = Calendar.current
let datez = calendar.date(from: dateComponents)
// change .month into .year to see the days available in the year
let interval = calendar.dateInterval(of: .month, for: datez!)!
let days = calendar.dateComponents([.day], from: interval.start, to: interval.end).day!
print(days)
}
-
This is the only answer here which returns the correct answer. `calendar.range(of: .day, in: .year, for: Date())!` always returns 31 – Mike Hay Jun 11 '19 at 21:57
-
1@MikeHay: *“... always returns 31”* – I don't think so. If you think that the other answers are wrong then I suggest to leave a comment at those answers, with a concrete example. – Martin R Nov 03 '19 at 12:08
0
What about for a given year?
The following is printing the number of days in the date's month:
let range = userCalendar.range(of: .day, in: .year, for: Date())!
print("Days In Year: \(range.count)") // prints 31
... and not the number of days in the date's year as expected :/

Chris Allinson
- 1,837
- 2
- 26
- 39
-
1Hello, found this bug too, its result as 31 on iOS 10 only, on iOS 11 works as expected. – Mike Demidov Mar 29 '18 at 08:57
-